1 名前:nobodyさん [2012/09/19(水) 18:58:43.51 ID:bdgNsY2f] 【正規表現道場の掟】 ・言語不問 ・質問も大歓迎。使用言語を書くのを忘れずに。 正規表現と関係ない話・質問は他スレへどうぞ。 前スレ 正規表現道場 kohada.2ch.net/test/read.cgi/php/1168450843/
92 名前:nobodyさん mailto:sage [2014/01/26(日) 00:17:59.26 ID:???] このスレは道場と名の付いてる通り正規表現のスキルアップを目指すスレです。 糞質問・キチガイは↓こちらにお願いします。 Regular Expression(正規表現) Part12 toro.2ch.net/test/read.cgi/tech/1387257592/
93 名前:90 mailto:sage [2014/01/26(日) 13:40:59.38 ID:???] >>91 ありがとうございました。勉強になります。 >>92 >>1 も読めない糞は2chには向いていないと思うよ。 もう何十年も居座っていると予想されるが、そろそろ自覚しなよ。
94 名前:nobodyさん mailto:sage [2014/01/26(日) 23:09:13.31 ID:???] ここはもう荒らしの本拠地になってるから仕方がないよ。 わざわざ煽りにム板まで出張してきてるし。
95 名前:nobodyさん mailto:sage [2014/01/27(月) 00:48:44.89 ID:???] こちらは精神異常者の隔離スレとなっております
96 名前:nobodyさん mailto:sage [2014/01/27(月) 05:05:55.59 ID:???] じゅんじゅんのきまぐれ d.hatena.ne.jp/junjun777/20110927/regexp_not_include おや、あわわさんとやらが俺の代わりに知らせに行ってくれてたのか。 あわわさん乙。ありがとう。 正規表現 Part11 toro.2ch.net/test/read.cgi/tech/1363769640/337 ってあれ?あわわさんのほうが6時間早い。CPU時計の時差?
97 名前:nobodyさん mailto:sage [2014/01/29(水) 03:59:46.05 ID:???] レベル高いスレにただいま。
98 名前:nobodyさん mailto:sage [2014/01/29(水) 04:05:21.14 ID:???] 荒らしの住み処 ただのクソスレ
99 名前:nobodyさん mailto:sage [2014/01/29(水) 05:11:24.62 ID:???] ところで向こうの267は雑技たんなのかな?266、雑技のネタに使ってもよかですたい。
100 名前:nobodyさん mailto:sage [2014/01/29(水) 08:45:10.20 ID:???] >>99 当たりw 266の書き方は考えたけど,今回のケースでは267の書き方で大丈夫と考えた. そういや質問者は「1」を含まないって書いてあるのに,なぜ「123」? とは思ったなw 後ろに他の正規表現を続けたりするとバックトラックして, 271の通りの可能性があるから初心者には266の方がいいのは確か. ただ,他にもいろいろ考え出すと,最も内側のものだけ削除したいのなら, ABC(?:(?!123|ABC|DEF).)*DEF と書いた方がいいとかもある. ちなみに266のミソは↓の辺りで微妙に使っていたりする. www.din.or.jp/~ohzaki/regex.htm#NoEndTag
101 名前:nobodyさん mailto:sage [2014/01/29(水) 15:23:04.24 ID:???] >>100 ああ、考えてみればABCも入れたほうがいいね。質問者の対象データが対になってる データだったから必要性を感じなかったが入れるべきだった、さすが雑技たん。 >なぜ「123」? 1というのは実データとは違う省略形と考えた。 初心者には文字と文字列の違いが分からないから文字列のつもりで1と書いてしまった 可能性がある。そこで文字列に対応しておけば1文字にも対応出来るってわけ。 >ABC(?:(?!123|ABC|DEF).)*DEF これが基本形やね。高速化するなら*+とか、もっとやるなら[^1AD]*+使ってごちゃごちゃ書いたり。 >NoEnd ミソは否定の中に分岐を入れることだからそれとはちょっと違うw それと <\2> だと <font> になってしまうで・・ <\2\b やね。
102 名前:nobodyさん mailto:sage [2014/01/30(木) 00:29:41.02 ID:???] >>101 >1というのは実データとは違う省略形と考えた。 なるほど.確かに,初心者ほど状況説明が下手だからね. >それと <\2> だと <font> になってしまうで・・ <\2\b やね。 単純なミスだな.指摘ありがとう.
103 名前:nobodyさん mailto:sage [2014/01/30(木) 07:11:02.94 ID:???] ・範囲内で文字列を含まない正規表現 $_ = "zzzABC XYDEFzzDEFz"; if ( m/ # Perl 5.10 以降で有効 ABC [^XAD]* (?: (?!XYZ|ABC|DEF). [^XAD]* )* (*PRUNE) # バックトラックステートの削除 (*SKIP) # 次回の走査開始位置をここに飛ばす (?:XY?)? # XYZとDEFの競合を想定した取りこぼし回収 DEF /xgsiaap ) { print "match! <".${^MATCH}.">"; } else { print "no match."; } >>102 修正乙!
104 名前:nobodyさん mailto:sage [2014/01/30(木) 13:46:05.59 ID:???] 修正乙の後でアレなんだけど、実際に動かしてみたらだいぶおかしいから手直ししてみたよ、と。 while ($html =~ / <(NOBR|CODE|B|PRE|FONT)\b (?= ( (?:(?!<\/\1>).)*? (?:<\1\b|$) ) ) /sixg ) { print "<".$1.$2, "\n"; } ------------- perl.htm ------------- <b><font><pre><b>aaa ------------- perl.htm ------------- *? はなるべく使いたくないなぁ・・ [^<]*+ を使って最適化したいw
105 名前:nobodyさん mailto:sage [2014/01/31(金) 02:30:50.66 ID:???] >>103 (*VERB:ARG) ってのは知らなかったなぁ. 今回のケースだと(*PRUNE)は(?>pattern)で置き換えができると思うが, マニュアルの 「(*PRUNE) は (?>pattern) 単独では表現できないケースを扱うために使えます。」ってのがどういうケースなのか想像できん. >>104 修正ありがと. 元のやつだと後ろを吸い込んじゃうからマッチ位置が先に進んでしまう. そうならないように先読みを使うと,先読み部分は後方参照に含まれなくなるから,先読みの中で改めて補足が必要って感じだね.
106 名前:nobodyさん mailto:sage [2014/01/31(金) 04:37:54.39 ID:???] >>105 >単独では ・・・ ( ・・・ (*PRUNE) ) みたいに ( ) で分断されてる場合とか? (?> だと2つ以上必要になる。 >マッチが先に 当たり〜。printのとこは""の中にまとめて書いても大丈夫だったのか、勉強になりますた。 改めて修正乙。
107 名前:nobodyさん mailto:sage [2014/01/31(金) 10:29:26.11 ID:???] >>103 「XYZとDEFの競合」ってのはXYZの後半部分がDEFの前半部分と同じ場合ってことかな? 例えば,xydとdef,とか,xdeとdefみたいな もしそういう,後半部分と前半部分が重なる場合を考え出すと,話がもう少しややこしくなる. つまり,ABCDとCDEFがキーだったときに,ABCDEFという文字があったら, それはABCD+EFと解釈するのか,AB+CDEFと解釈するのか,という問題. その解釈がすべて前方優先なのか,すべて後方優先なのか,それともキーの相互の優先度で決まるのか, あるいは,あらゆる可能性を許すのか,あらゆる可能性を許さないのか. キー自身が重なる場合もある. 例えば,ABCABみたいなキーだったとき,ABCABCABは,ABCAB+CABなのか,ABC+ABCABなのか.
108 名前:nobodyさん mailto:sage [2014/01/31(金) 10:34:35.37 ID:???] >>106 >・・・ ( ・・・ (*PRUNE) ) なるほど,括弧の深いところで使うと,(?> で表現するのは大変そうだ. しかも,もしそれが中間レベルで分岐してたりすると,(?> では表現しきれないかな.
109 名前:nobodyさん mailto:sage [2014/01/31(金) 16:13:45.49 ID:???] >>107 ぶっちゃけその辺は何も考えてない。試作品とかテンプレートみたいな感じで作っただけ。 競合対策の部分は普通の使い方をするならいらないね、HTMLやXMLタグで挟まれた文字列にマッチさせるときとか。 こういうの以外に使い道が思い当たらないし。(だったら付けるな) >>108 >分岐 なるほど、(?> ではお手上げだ。俺も年末に覚えたばかりでよく分かってない。
110 名前:nobodyさん mailto:sage [2014/02/01(土) 16:48:52.03 ID:???] ## (*COMMIT) $_ = "12"; if ( m/^1((*COMMIT)3|2)/ ){ print "match!\n"; } # 分岐の中で踏まれると以後ほかの分岐要素を走査することがなくなる。 # 現在の分岐要素がマッチ失敗したら全体もマッチ失敗となり検索はそこで完全終了する。 m/^1(*COMMIT)(3|2)/ # 下位層の分岐は走査され、マッチが成功する。 $_ = "12"; @test = $_ =~ m/^1(*COMMIT)A|\d/g; print "@test\n"; # /g でも次位置からの走査は行われない。 @test = $_ =~ m/^1(*COMMIT)|\d/g; # 結果 = 1 2 。マッチが成功した場合は走査を止めることはない。(失敗したときだけ止める)
111 名前:nobodyさん mailto:sage [2014/02/01(土) 17:24:27.45 ID:???] Q、(*COMMIT) とは逆にマッチが成功したときだけ /g を止める最も簡単な手段は何か? $_ = "123"; @test = $_ =~ m/1|2|3/g; print "@test\n"; ↑2 がマッチ成功したときに /g を止め、3がマッチしないようにする。 フラグ変数を用意、チェックすれば可能だがもっと手軽な手段はないか。
112 名前:nobodyさん mailto:sage [2014/02/02(日) 07:59:18.35 ID:???] う〜ん、/g はループなのに break する方法が用意されていない。 COMMIT があるのにこれがないのはとても不可解だ。 # 先読みの中の (*SKIP) は機能しない。 @test = $_ =~ m/1|2(?=.*(*SKIP))|3/g; # while 文の last を使う。 $_ = "123"; while ( m/1|2|3/gp ) { print "${^MATCH}\n"; last; } # 1 で止まる。 # (?{code}) で last → 効果なし while ( m/1|2(?{ last; })|3/gp ) # while 文に名前を付けて (?{code}) で last → 効果なし TEST : while ( m/1|2(?{ last TEST; })|3/gp ) perl陣営に言えば新しいコマンド作ってくれそうだなぁ。
113 名前:nobodyさん mailto:sage [2014/02/02(日) 08:47:00.66 ID:???] # (?-g) → 効果なし while ( m/1|2(?-g)|3/g ) # 苦肉の策 (現実的でない) while ( m/(1)|(2).*|(3)/g ) { print "${^N}\n"; } # 苦肉の策 + 最後の空文字列にマッチしない対策 (現実的でない) while ( m/\z(*COMMIT)(*F)|(1)|(2).*|$/g ) { print "match! ${^N}\n"; }
114 名前:nobodyさん mailto:sage [2014/02/02(日) 10:19:23.61 ID:???] >>111 >>112 >>123 /g がループというのはちょっと違う. リストコンテキストで評価したときはループと言えるが,スカラーコンテキストで評価したときはループではなく, 単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ. この問題はリストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないかって言う問題だと解釈した. スカラーコンテキストで評価したときに止めるんなら last を使えば簡単に止まる話. つまり,while を使っていいんなら, while (/1|2(*:STOP)|3/g) { push(@test, $&); last if $REGMARK eq 'STOP'; } print "'@test'\n"; リストコンテキストで評価したときに途中で止めるには,かなり条件が限定されるが, @test = $_ =~ m/(?(?<=2)\G(*COMMIT)(*FAIL))(?:1|2|3)/g; ぐらいしか思いつかなかった. これではフラグを使った方が簡単だろう.
115 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/02(日) 14:00:26.89 ID:???] >>114 >ループというのはちょっと違う そのへんはちゃんと理解してるから大丈夫。foreachとか<>みたいなつもりで書いてるから。 >リストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないか その通り。 >(*:STOP) これはフラグ変数を使うやり方とまったく同じだからボツ・・。{ } の中で last するのはナシ。 m/ / の中で止められないか、という話だから。 しかも$REGMARKと$REGERRORは予期しない動きをすることがあるから 普通にフラグを使ったほうが確実。(後述) >これではフラグを使った方が簡単だろう やっぱそうかぁ、雑技たんでもダメなら無理そうだね。考えてくれてありがとう。
116 名前:nobodyさん mailto:sage [2014/02/02(日) 14:08:53.79 ID:???] ## $REGERROR # マッチ失敗でも$REGERRORが偽を返す例 $_ = "11"; m/^(*MARK:NAME)12/; if ($REGERROR){ print "yes\n" }else{ print "no\n"; }; 結果 → no # 2 を (?!) や (*FAIL) に変えると・・? m/^(*MARK:NAME)1(?!)/; 結果 → yes 2 を $ にすると no のまま。
117 名前:nobodyさん mailto:sage [2014/02/02(日) 14:12:45.66 ID:???] あれ、$REGMARK が予期しない動作になるデータはないや。 ごめん、使えないのは $REGERROR だけかも。
118 名前:nobodyさん mailto:sage [2014/02/02(日) 14:30:37.56 ID:???] >単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ あ、ちゃう、これ分かってなかった。場所覚えてるだけだったのか、違和感感じてたんだけど やっと理解出来たよ、ありがとう。 あと雑技たんのサイトだけど >回文にマッチする正規表現 # 再帰版 × (??{$palindrome})* ○ (??{$palindrome})? だね。前者だと回文を繋げた文字列 121454989・・・ みたいなのを拾ってしまう。
119 名前:nobodyさん mailto:sage [2014/02/02(日) 20:34:08.85 ID:???] >>117 確かに $REGERROR は期待通りに動かないな. >>118 回文の間違い指摘ありがとう.
120 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/02(日) 20:50:07.49 ID:???] おや、出来ちゃった・・ # リストコンテキスト + /p のマッチング中に break する。 $_ = "123"; @test = $_ =~ m/ 1 |2 (?{ $last = "${^MATCH}"; }) (*COMMIT)(*F) |3 /xgp; push(@test,$last); print "@test\n"; # リストコンテキスト + /p のマッチング中に break する。( push版 ) push(@test, m/ 1 |2 (?{ $last= ${^MATCH}; }) (*COMMIT)(*F) |3 /xgp , $last ); >>119 仕事はやっ!修正乙〜
121 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/03(月) 07:41:48.62 ID:???] ↑× /p のマッチング中に → /g の間違い ---------------------------------------------- # 先読みの中の (*SKIP) は正しく機能する。(× >>112 ) $_ = "123"; @test = $_ =~ m/1|2(?=.*\z(*SKIP)(*F))|3/g; print "@test\n"; # 結果 → 1 # 先読みの中の (*SKIP) が失敗する例もある @test = $_ =~ m/1|2(?=.*\z(*SKIP))(*F)|3/g; # 結果 → 1 3 # perl内部の最適化の影響により (?=) より早く (*F) が判定されている? # $REGERROR が期待通りに動かない原因も最適化が犯人? (最適化は 詳説 正規表現 参照) ---------------------------------------------- # \z で始まる正規表現 + while( /g ) while ( m/\z(?{ print "in code\n"; })/g ) { print "match!\n"; } <結果> in code match! in code 2回走査されてる。2回目は走査しといてマッチ失敗。/g により1つ先に進む動作の副作用? (?{code}) が2回実行されるのでプログラムが想定外の動作になる可能性。 /g を忘れると走査開始位置が毎回先頭に戻り、無限ループになる。
122 名前:nobodyさん mailto:sage [2014/02/03(月) 17:57:59.62 ID:???] # リストコンテキスト + /g のマッチング中に break する。(perl 旧verl対応版) $_ = "12223"; @test = $_ =~ m/ 1 |2 (?{ $last = "$&"; }) .*\z # 余った文字列を全部マッチさせる。 |3 /xgs; $test[$#test] = $last; # 最後の要素の入れ替え print "@test\n"; これらを "break出来てる" と言うのはちょっとおこがましいかも知れない。やはり break コマンドが欲しい。
123 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/04(火) 13:37:35.16 ID:???] ・$REGERROR を (?{code}) と入れ替えて実験 my $cnt = 0; $_ = "11"; m/^(?{ $cnt++;})1(*F)/; print "$cnt\n"; # 結果 → 1 my $cnt = 0; $_ = "11"; m/^(?{ $cnt++;})12/; print "$cnt\n"; # 結果 → 0 $REGERROR さんに無罪判決。冤罪でした。
124 名前:nobodyさん mailto:sage [2014/02/04(火) 13:39:28.33 ID:???] 皆様、こんにちは 質問させてください テキスト内の文字を置き換えるアプリ(Devas)で作業をしています 正規表現で文字検索と置き換えしたいのですが表現法がわかりませんので 詳しい方アドバイス下さいませんでしょうか? テキスト内には .(ドット)abc"IMG .(ドット)def"IMG .(ドット)ghr"IMG など . と "IMG で囲まれた数パターンの文字列がありこれに元文字列を利用し .photo を付け加えたいのです .(ドット).photo.abc"IMG .(ドット).photo.def"IMG .(ドット).photo.ghr"IMG 検索、置き換え 共に正規表現が使えるアプリなのですがそれぞれどう表現して良いのか教えてくださいませんか? よろしくお願いいたします
125 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/04(火) 13:41:51.03 ID:???] ・開始タグと閉じタグの間に文字列を含まない正規表現 (正規表現 否定 除く) $_ = "ABC ABC DEF ABCDEF"; while ( m/ # Perl 5.10 以降で有効 ABC [^ADX]* # 先頭の文字を使った高速処理 (?: (?: DEF (*ACCEPT) # マッチ成功 |\K ABC # 今までマッチした文字列を捨ててリスタート |XYZ (*PRUNE) (*SKIP) (*F) # NGワード検出、マッチ失敗 |. # ↑の3つ以外の1文字 ) [^ADX]* )* (*COMMIT) (*F) # DEFで閉じられないまま終端に到達。 /xgsiaap ) { print "match! <${^MATCH}>\n"; } # NGワード、開始タグ、閉じタグの競合は想定していない。 # 例、NGワード="</" 、 閉じタグ="</div>"
126 名前:nobodyさん [2014/02/04(火) 20:09:35.38 ID:xuvSG1oC] s/^\./.photo./g 行頭限定の場合
127 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/05(水) 16:22:38.43 ID:???] >>124 <検索> \.([a-z\d]{1,4}"IMG\b) <置換> ..photo.$1 \. を ( ) に入れてないのは処理効率を上げるため。 「abc」の部分は拡張子と考えて数字も許可した。(1文字以上4文字以下の英数字) 何かまずかったら遠慮なく。
128 名前:124 mailto:sage [2014/02/06(木) 18:00:16.14 ID:???] たくさんレスいただきましてありがとうございます お礼が遅れまして申し訳ありません 127様の \.([a-z\d]{1,4}"IMG\b) で無事検索できることができました しかし置き換えでは マッチした文字列が ..photo.$1 に置き換わるだけで $1にマッチした語句が適応されません 検索結果 ○○○○○○.abc" IMG が ○○○○○○..photo.$1 となります 希望では ○○○○○○.photo.abc" IMG となることです(単純に .拡張子 前に .photo を入れたい) 先の書き込みでの訂正がありました 申し訳ありません 検索したい文字列には " と IMG の間に半角スペースがありました 半角があっても上手く検索にひっかっかっていますが 上手く置き換えができないのはこの半角が原因なのでしょうか? 引き続きご指導いただければ幸いです よろしくお願いいたします
129 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/06(木) 20:27:01.21 ID:???] >>128 ごめんなさい、こちらにも見落としがいくつかありました。 ( Devasにはメジャーな正規表現エンジンが使われていると考えて作りましたが違ったようです ) ・通常版 (上行=検索、下行=置換) \.[a-zA-Z\d]{1,4}" ?IMG\b .photo\0 ・拡張子を小文字に変換する版 (例 .JPG → .jpg ) \.([a-zA-Z\d]{1,4})(" ?IMG\b) .photo.\L\1\E\2 ・ 「"」 と IMG の間のスペースがあっても無くてもスペース1個にする版 \.([a-zA-Z\d]{1,4})" ?IMG\b .photo.\L\1\E" IMG # \L と \E を削除すれば拡張子の小文字変換はしなくなります。 # 本当は .photo.photo.jpg のような複数回置換による重複を防ぎたかったんですが # この正規表現エンジンでは無理なようです。(>_<)
130 名前:nobodyさん mailto:sage [2014/02/06(木) 22:22:42.47 ID:???] >>129 度々のレスありがとうございます 正規表現エンジンにもいろいろなものがあるとは知りませんでした お手数をおかけいたしまして申し訳ありません いくつものパターンを示してくださいまして 重ねて感謝いたします 通常版にて理想の変換ができました 今回教えて頂いたような知識を深めて、もっと便利にPCを使えるようになりたいと思います 勉強になりました ありがとうございます m(_ _)m
131 名前:nobodyさん mailto:sage [2014/02/09(日) 02:41:58.21 ID:???] 質問させてください。 phpのpreg_match関数でwebページから文字列を抽出したいと考えています。 以下を使用して抽出していますが、改行が含まれると抽出ができませんでした。 $text = '/value="(.*?)" id="latest"/'; preg_match($text, $source, $matches); $word = $matches[1]; 色々調べて$textを以下のようにしてみましたが、うまくいきませんでした。 $text = '/value="(.*?)" id="latest"/s'; $text = '/value="([\s\S]*?)" id="latest"/'; $text = '/value="((\n|.)*?)" id="latest"/'; 何故うまくいかないのかよくわかりません。 なにかアイデアはありませんでしょうか?
132 名前:nobodyさん [2014/02/09(日) 08:07:39.87 ID:J9pikab5] 俺なら /value="([^"]*)"\s+id="latest"/
133 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/09(日) 17:20:31.79 ID:???] × ' ' ○ " " というオチ?PHPは触らないから分からない。
134 名前:nobodyさん [2014/02/09(日) 17:39:19.85 ID:J9pikab5] PHPなんか触らないから分からないけど両端のすらすらが余計とかなんかね
135 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/09(日) 18:09:22.12 ID:???] ごめんなさい、PHPの解説サイト見たら ' ' でOKでした。
136 名前:nobodyさん mailto:sage [2014/02/11(火) 10:03:59.12 ID:???] PHPスレで聞いたほうが早いかも。原因が改行以外にある可能性も十分あるので 動かないサンプルコードをアップして見てもらえば確実に原因教えてもらえると思う。
137 名前:nobodyさん mailto:sage [2014/02/11(火) 13:41:52.16 ID:???] ↑$source に入るHTMLファイルも見ないと原因が分からない可能性アリ。
138 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/13(木) 23:18:13.09 ID:???] 再帰と (?( ) yes|no) の組み合わせが楽しすぎる。もしかしたら宝の山かも。 マトリョーシカの中にダルマを入れられる感じ。
139 名前:nobodyさん mailto:sage [2014/02/15(土) 18:56:47.98 ID:???] 正規表現メモ www.kt.rim.or.jp/~kbk/regex/regex.html#NOTINCLUDED 「調整中」 気付いてもらえたのかそうでないのかいまいち分からんす。 このサイトはあんまアテにしないほうが良さそうだ。
140 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/16(日) 14:59:01.14 ID:???] >>125 の疑問点 \K が分岐の先頭にあることで処理速度に遅れが出るかどうか調べる。 また、\K を使わない書き方とどちらが早いか調べる。
141 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/16(日) 15:40:17.27 ID:???] 比較対象追加 ( >>125 ) | (?=ABC) \K ABC
142 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/16(日) 20:56:16.32 ID:???] ( >>125 ) | (?=ABC) \K ... Perl6 正規表現 I dl.dropboxusercontent.com/u/16667824/perl6/AdventCalender/1/5.html
143 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/17(月) 00:27:24.93 ID:???] Perl6::Overview::Rule search.cpan.org/~lichtkind/Perl6-Doc-0.36/lib/Perl6/Doc/Overview/Rule.pod [foo|bar]+ Perl6ではこれが正しい書き方になるらしい。初心者がハマりそう・・罠的な意味で。 先読み、戻り読みは書きにくくなった感が否めない。 文字クラスも加算、減算をしないときでも <> で囲う必要があるのはめんどくさい。 が、新しいオモチャとしては十分楽しめそう。ついでに英語も覚えてしまおう。
144 名前: ◆QzqhRqBYxktP mailto:sage [2014/02/22(土) 00:25:15.35 ID:???] S05 feather.perl6.nl/syn/S05.html > Last Modified: 11 Feb 2014, Version: 174 A05 search.cpan.org/dist/Perl6-Doc/share/Apocalypse/A05.pod > Last Modified: 18 May 2006, Number: 5, Version: 7 perl6ではもはや正規表現ではないという意味を込めて 「regex」 と呼んでるらしい。 perl5の正規表現にあった 「ゴチャゴチャ感」 が綺麗に一掃されてる感がある。 :ratchet があるのは最高だなぁ。
145 名前:nobodyさん [2014/03/01(土) 19:39:32.33 ID:n8n41uDi] anago.2ch.net/test/read.cgi/applism/1393578532/139 anago.2ch.net/test/read.cgi/applism/1393578532/157 この書込の方を正規表現でNGにしたいと思っています。 条件は 最初の行とは限らないが、「・」で初める行がある。何文字かの後、改行 その次の行は空の行 この2セットを正規表現で表すにはどうすればいいでしょうか? .*?・.*?\r\n\r\n としてみましたがダメでした。
146 名前: ◆QzqhRqBYxktP mailto:sage [2014/03/01(土) 20:13:27.84 ID:???] >>145 2chブラウザ用でいいのかな?処理速度重視で作った。 (?:^|<br>)(?>\s*)・(?>[^<]*(?:(?!<br>).[^<]*)*)<br>(?>\s*)<br>
147 名前:nobodyさん [2014/03/01(土) 20:45:21.19 ID:n8n41uDi] >>146 素敵! 神! すっきりしました! テキストじゃなくhtmlに対して正規表現だったのですね、勉強になりました。 ありがとうございました!
148 名前:nobodyさん [2014/03/02(日) 02:32:48.90 ID:2i/vkXtz] htmlに対してとかじゃなくログに合わせろと
149 名前: ◆QzqhRqBYxktP mailto:sage [2014/03/04(火) 19:52:20.08 ID:???] (>>146 ) (?:^|<br>) は分岐のバックトラックが残るから (?><br>|\A) としたほうが良さそう。 この2つは動作が完全なイコールではないので注意が必要、文頭が <br> だった場合に 絶対に \A がマッチ出来なくなるため。これが問題になることはほとんど無いだろうけど。
150 名前:nobodyさん mailto:sage [2014/03/05(水) 08:18:57.21 ID:???] (>>144 ) S05 ttp://perlcabal.org/syn/S05.html >Last Modified: 27 Feb 2014 Jeffrey Friedl ttp://regex.info/ Jeffrey Friedl - 第3版のコード ※ CGIなので直リンは避けたほうが良い。 regex.info/listing.cgi?ed=3&p=all 第2刷に対する正誤表 - 詳説 正規表現 第3版 ttp://www.oreilly.co.jp/books/9784873113593/#errata0 Google Books 詳説 正規表現 ※ 立ち読み可能 ttps://www.google.co.jp/search?tbm=bks&hl=ja&q=%E8%A9%B3%E8%AA%AC%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
151 名前:nobodyさん mailto:sage [2014/03/13(木) 06:24:42.94 ID:???] ascii抜粋 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
152 名前:nobodyさん mailto:sage [2014/03/17(月) 17:00:03.12 ID:???] >>142 >Perl6 正規表現 I ここのサイト主、先読みを理解出来てないな・・。beforeとafterも逆だし。
153 名前:nobodyさん mailto:sage [2014/03/21(金) 12:20:24.42 ID:???] tes
154 名前:nobodyさん mailto:sage [2014/03/22(土) 00:49:43.59 ID:???] windowsXP ショートカットのパス --------- C:\WINDOWS\system32\cmd.exe /k C:\test.pl6 --------- /k は実行後にウインドウを閉じないオプション。 拡張子 pl6 を perl6.exe に関連付けしておく。 test.pl6 にperl6のテストコードを書いて実験する。
155 名前:nobodyさん mailto:sage [2014/03/23(日) 15:15:41.32 ID:???] #!/usr/bin/perl6 my $str; $str := "AAABBBCCC"; say $str.trans( 'A'=>'a', 'B'=>'b', 'C'=>'c' ); say "\n"~$str; ---結果--- aaabbbccc AAABBBCCC
156 名前:nobodyさん mailto:sage [2014/03/26(水) 20:28:04.50 ID:???] ### winXP で文字コードの 『et_EE.ISO8859-1』 を使えるようにする手順 !!! 試すときは仮想マシンを使うこと。環境が壊れて文字化けだらけになるため。 !!! 1、「コントロールパネル」 → 「地域と言語のオプション」 2、「日本語」 や 「日本」 と設定されている所を全て 「エストニア」 に設定する。 3、PC再起動 => perl から et_EE.ISO8859-1 が使用可能になる。 順番が s z t u に変わったことを確認。ただ、 [a-z] で t 以降もマッチするのは変わらず。 [FreeBSD] - 2005/9/3 ( => FreeBSD4.10? ) lists.freebsd.org/pipermail/freebsd-bugs/2005-September/014529.html lists.freebsd.org/pipermail/freebsd-bugs/2005-September/014531.html 正規表現 Part11 toro.2ch.net/test/read.cgi/tech/1363769640/330,325
157 名前:nobodyさん mailto:sage [2014/03/26(水) 22:02:12.05 ID:???] FreeBSD - 2005/9/5 lists.freebsd.org/pipermail/freebsd-bugs/2005-September/014529.html lists.freebsd.org/pipermail/freebsd-bugs/2005-September/014531.html 正規表現 Part11 toro.2ch.net/test/read.cgi/tech/1363769640/330,325 [[ winXPで et_EE.ISO8859-1 を使う ]] 1、「コントロールパネル」 => 「地域と言語のオプション」 2、「日本」 「日本語」 を全て「エストニア」 に変更。 3、PC再起動 perlで s z t u の順になるのを確認。しかし [a-z] が t u 以降にもマッチするのは変わらなかった。 => 順番が変わることによるトラブルを避けるために対策されている? ※ これをやると環境の一部がエストニア語で上書きされ日本語に戻せなくなるので 試すなら 「VM ware」 や 「Virtual PC」 等の仮想マシンで試しましょう。 2005/9/5 に問題報告がされているのでそれ以前にリリースされたFreeBSDを使って試せば 完全に再現出来る可能性大。そして 4.11で再現出来なくなっていれば対策が取られたということになる。
158 名前:nobodyさん mailto:sage [2014/03/30(日) 04:03:56.61 ID:???] --------c:\test.pl----------- use locale; print +(sort grep /[a-z]/i, map { chr } 0..255), "\n"; --------c:\test.pl----------- C:\>perl test.pl aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsSzZtTuUvVwWxXyY C:\>perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x86-multi-thread ----------------------------------- ↓これを使わなくても順番が変わった。 use POSIX qw(setlocale LC_ALL); setlocale(LC_ALL, "et_EE.ISO8859-1"); コンパネで「エストニア」と指定しただけで「et_EE.ISO8859-1」は未指定の状態。 ----------------------------------- /[a-z]/i を /\w/ に変えると英字以外の文字も英字の間に 挟まっていることが確認出来る。
159 名前:nobodyさん mailto:sage [2014/03/30(日) 04:24:51.20 ID:???] --------c:\test.pl----------- use locale; # これが無いと順番が変わらない use POSIX qw(setlocale LC_ALL); # コメントアウトしても変化なし setlocale(LC_ALL, "et_EE.ISO8859-1"); # コメントアウトしても変化なし my $abc; $abc = "STU"; $abc =~ s/[A-Z]/hit/g; print $abc."\n"; --------c:\test.pl----------- [結果] hithithit 順番が変わっていれば S にしかマッチしないはずだが3文字すべてに マッチしている。 LC_ALL を LC_CTYPE や、 LANG などに変えたり、test.plを保存するときの 文字コードをutf-8からshift_jisに変えたりしても結果変わらず。 XPsp3+perl5.16.3の環境で S だけにマッチさせる手段は無いと思われる。
160 名前:nobodyさん mailto:sage [2014/03/30(日) 05:25:46.81 ID:???] >>156 「辞書順」はロケールに依存するが「文字コード順」は文字コードに依存する、んじゃね? 文字集合の範囲指定が文字コード順と定義されているなら、 いくらロケール切り替えても文字コード切り替えない限り無意味だろう。 で、文字集合の範囲指定ってどっちだと定義されてるの?
161 名前:nobodyさん mailto:sage [2014/03/30(日) 14:02:22.42 ID:???] >>160 俺はロケールや文字コードの知識はほとんど無いんでよく分かってない。 ↓は winXPsp3 + perl5.16.3 + ロケール = 「日本」 の環境での実験結果。 ・ [ァ-ィ] が ア にマッチするか実験。( 文字コード順ならマッチしないはず ) ---------------------------------------- use locale; if ( "ア" =~/[ァ-ィ]/ ){ print "hit\n"; } else { print "no hit\n"; }; ---------------------------------------- 結果: hit ( マッチしたので文字コード順ではない ) この環境での範囲指定は↓の順みたい。これはshift_jisの並び順とは違う。(これが辞書順?) ---------------------------------------- _0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZァアィ スセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロワヲン ---------------------------------------- 文字コードでなくロケールに依存するという発想は思い付かなかったわ、そっちの線で また実験しながら遊んでみるよ、辞書順とやらも調べてみる。ヒントありがとう。
162 名前:nobodyさん mailto:sage [2014/03/31(月) 00:44:57.15 ID:???] (>>156 ) ついに [a-z] が t 以降にマッチしない動作の再現に成功! et_EE.ISO8859-1 の代わりに et_EE.ISO8859-15 を使ったら再現出来ました! 今まで助言をくれたみなさんありがとう〜。自分一人じゃ絶対無理だった。 ↓こちらの方々にも感謝〜 初心者もOK! FreeBSD質問スレッド その117 toro.2ch.net/test/read.cgi/unix/1380865524/938-954n 詳しい手順はもう少し調べて整理してから載せます。
163 名前:nobodyさん mailto:sage [2014/04/01(火) 22:34:44.19 ID:???] 正規表現道場 in ジオシティーズ akiba.geocities.jp/hp20140401/ とりあえず場所確保。
164 名前:nobodyさん mailto:sage [2014/04/12(土) 17:21:41.17 ID:???] 2ch .scに移転しました。 正規表現道場 Part2 nozomi.2ch .sc/test/read.cgi/php/1348048723/l50 ■ 2ch.netの問題点 ・ 2chscがNGワードになってるので正規表現をスレに貼るのに支障が出る。何より言論統制はイクナイ。 ・ 管理人が今後どう動くか予測が付かない。 自暴自棄になりIPや書き込み履歴を大公開して逃走する可能性すらある。会社IPの人は注意。
165 名前:nobodyさん [2014/04/12(土) 20:53:07.28 ID:kZRku0LV] もうこっちに帰ってくるなよ
166 名前:nobodyさん [2014/04/15(火) 11:21:18.41 ID:qQPWwAKL] 使用しているのはYahoo! Pipesのregexです d.hatena.ne.jp/dacs/20080422/1208868051 ○○/△△&#xd;[□□ という文字列から△△だけを抜き出したくて、色々試してみているのですがどうもうまくいきません ".*/" -> replace -> "" "\&#xd;.+" -> replace -> "" だと思うのですが、何か間違いがあるのでしょうか? ちなみに "[.+" -> replace -> "" も試してみましたがダメでした
167 名前:nobodyさん [2014/04/15(火) 20:38:11.07 ID:CfZz5H/X] Yahoo! Pipesの仕様なんて知らんが 文字列の開始も終わりも指定してないということは .*/で一番最後の/までが対象として消える可能性はある
168 名前:nobodyさん mailto:sage [2014/04/16(水) 10:42:38.10 ID:???] >>167 ありがとうございます、確かめてみます
169 名前:nobodyさん mailto:sage [2014/05/08(木) 02:37:21.25 ID:???] ファイル検索ツールでパスを入力する時、「\」「/」を入れると候補が0になってしまいます d:\\abc\\123\\ のように入力しているのですが、間違っていますか?
170 名前:nobodyさん [2014/05/08(木) 03:20:39.96 ID:Zyar7s4i] そのファイル検索ツールのところで聞けばー
171 名前:nobodyさん mailto:sage [2014/05/22(木) 01:25:49.65 ID:???] sc連投規制中なう。
172 名前:nobodyさん mailto:sage [2014/05/22(木) 14:43:31.27 ID:???] (sc>>212 ) >qr/\"((?:\\[\\\"]|.)*?)\"/ > これはよっぽど自信がないと書けない書き方だ。 今考えると弾たんは単に2文字否定の作り方を知らなかっただけだな・・。 知ってたらこんなあやふやなものを作ろうなんて思わないし。 早さに拘るのに早い正規表現の作り方を知らないというちょっと残念な弾たん。 他の正規表現を見ても正規表現自体のスキルは高くない。 なんでもこなすオールラウンダーだから薄く広くになるんだろうな。 しかしこの程度の正規表現スキルでcpanのモジュール作って大丈夫なんだろうか。 探せばバグが出てきそうな予感。
173 名前:nobodyさん mailto:sage [2014/05/22(木) 15:18:43.78 ID:???] 正規表現のスキル自体とモジュール作成能力には直接的な相関関係はないからなあ・・・
174 名前:nobodyさん mailto:sage [2014/05/22(木) 16:18:04.88 ID:???] (‥ )フーン
175 名前:nobodyさん mailto:sage [2014/05/22(木) 16:49:22.13 ID:???] そういう指摘するだけでモノ作ったり貢献してなさそうなお前はもっと駄目な人間だから安心しろ。 弾はなんだかんだ色々作ってるし色々な方面に貢献してる。
176 名前:nobodyさん mailto:sage [2014/05/22(木) 18:11:53.77 ID:???] 指摘することも立派な貢献だと思いますよ。現に指摘によって処理時間が半分以下になってますし。
177 名前:nobodyさん mailto:sage [2014/05/23(金) 17:54:18.09 ID:???] まだ連投規制が解除されないなう ## m// キャッシュを保持してない状態では空文字列にマッチする。 うっかりするとバグの原因になり得る。
178 名前:nobodyさん mailto:sage [2014/05/23(金) 19:00:28.59 ID:???] .scの連投規制は俺も食らったけど(専ブラだと「書き込めたかも…」で書けてない状態)、 Webブラウザで投稿したらBOT疑惑なのでCapchaしろになってそれで解除できた。 URLを貼りまくって連投規制になった場合は知らん。
179 名前:nobodyさん mailto:sage [2014/05/23(金) 19:22:48.54 ID:???] >>178 俺の場合は「連続投稿は禁止されています。Error!」って出るだけ。 普通に連続投稿が原因で規制食らってるみたいだからもうダメかも分からんね。 人が少ないから自然に独り言みたいになるのにそれで規制されたら ますます人少なくなるなw
180 名前:nobodyさん [2014/05/23(金) 20:03:59.73 ID:Hym2JLxi] たらこテョンねるの話はたらこテョンねるでやれ
181 名前:nobodyさん mailto:sage [2014/05/23(金) 22:52:00.36 ID:???] パールを使った正規表現 omatomen.net/archives/1002062987.html
182 名前:nobodyさん mailto:sage [2014/05/24(土) 02:35:30.04 ID:???] >>2 正規表現メモ (?num) の説明文にある・・ ------------------- (\()?[^()]+(?(1)\)) ------------------- これは (?num) とはまったく関係ない正規表現。ただの条件文。
183 名前:nobodyさん mailto:sage [2014/05/24(土) 15:06:27.80 ID:???] >>182 ---------------------------- (?(R)...) PCREで、再帰的パターンの開始を示します。 <(?:(?(R)\\d++|[^<>]*+)|(?R))*> ---------------------------- 説明文は間違い。これは条件式の条件。\\d は \d の間違い。 perldoc.jp perldoc.jp/docs/perl/5.14.1/perlre.pod (?(condition)yes-pattern|no-pattern) の項目を参照。
184 名前:nobodyさん mailto:sage [2014/05/27(火) 02:44:28.34 ID:???] 詳説 正規表現のAmazon値 (1年前との比較) ・古本 初版 &nbsp;500円 → 1998円 2版 1600円 → 3150円 3版 4000円 → 3709円 ・新品 3版 5184円 Amazon - "正規表現" www.amazon.co.jp/s/field-keywords=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
185 名前:nobodyさん mailto:sage [2014/05/27(火) 03:16:35.15 ID:???] 文字参照の処理、間違えてますよ > 2ch.net
186 名前:nobodyさん mailto:sage [2014/05/27(火) 03:43:16.09 ID:???] ttp://cpansearch.perl.org/src/DANKOGAI/Unicode-Char-0.02/lib/Unicode/Char.pm ↓ ^ か \A 忘れてね? ------------------------ $method =~ s/.*:://o; ------------------------
187 名前:nobodyさん mailto:sage [2014/05/27(火) 03:49:35.83 ID:???] ---------------------------------------------------------- my ($hex, $name) = ($line =~ /^([0-9A-Fa-f]+)\s+(.*)/); next if $name =~ /[a-z]/; # range, not character ---------------------------------------------------------- 2行目だけ小文字に限定されてる。これで良いのか悪いのかは分からないが。
188 名前:nobodyさん mailto:sage [2014/05/27(火) 14:20:55.14 ID:???] ttp://cpansearch.perl.org/src/DANKOGAI/Lingua-JA-Numbers-0.04/lib/Lingua/JA/Numbers.pm ----- せっかく [eE] と書いてるのに /i = ($num =~ /([+-])?(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?/io); ----- ちゃんと動くんだろうけどアンカー付けないのが気持ち悪い。 $int =~ s/(.*)(.{48})\z/$2/o; ----- これミスでね? [k|g] if ($style =~ /(?:romaji|[k|g]ana)$/){
189 名前:nobodyさん mailto:sage [2014/05/27(火) 14:23:03.78 ID:???] 本人に直接言う勇気がないらしい。まこと残念な人である 皆はこうならぬように
190 名前:nobodyさん mailto:sage [2014/05/27(火) 14:28:03.82 ID:???] 今度は大文字限定。 $ja =~ tr/[G-Z]//d; ITPro: tr///d itpro.nikkeibp.co.jp/article/Reference/20080930/315784/
191 名前:nobodyさん mailto:sage [2014/05/27(火) 14:50:18.14 ID:???] あれ、/o が使われてる。なんでapache logのltsv変換には 使われてなかったんだろう。ああいう時こそ効果的なのに。
192 名前:nobodyさん mailto:sage [2014/05/27(火) 15:43:22.68 ID:???] ■ combined2ltsv.pl の re で /o の有無をタイム計測 /o なし 12724/s /o あり 31689/s /o あり は2.5倍早い。これは報告したほうがいいかも。