1 名前:デフォルトの名無しさん [2017/03/15(水) 02:04:35.47 ID:e01p03UP.net] Regular Expressionスレです。 質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。 前スレ Regular Expression(正規表現) Part13 echo.2ch.net/test/read.cgi/tech/1415149975/ 次スレは>>980 宜しく 天ぷら等2以降
652 名前:583 mailto:sage [2018/09/21(金) 23:41:08.24 ID:LI7qokUP.net] >>634 そういうことじゃないんだな、>>628 を読んでね ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど 一行で書かれた正規表現を複数行に展開するのはかなり難しい 正規表現のパーサを作るということになるから だから正規表現ライブラリに実装されることが望ましい ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる 逆にテキストエディタの作者がやろうとすると動作を把握しきれずに 不完全なものになったり、実装を諦めたりすることになりかねない 複数行をスタンダードにするためにはライブラリ側での実装が必須となる
653 名前:デフォルトの名無しさん [2018/09/22(土) 02:13:48.20 ID:EPQO3h7N.net] >>635 鬼雲とbregonig.dllの作者さんまでどうぞ https://twitter.com/k_takata https://github.com/k-takata/Onigmo https://github.com/k-takata/bregonig k-takata.o.oo7.jp/mysoft/bregonig.html あと鬼車オリジナルの作者さんも復活してたんだね https://github.com/kkos/oniguruma/issues (deleted an unsolicited ad)
654 名前:583 mailto:sage [2018/09/22(土) 21:31:53.89 ID:SLHR4wJP.net] >>636 bregonig.dllはプログラミング用のライブラリをテキストエディタでも 使えるようにしたっていう感じなのでプログラミングに必要のない機能は 付けたくないと思う、管理が大変になるからね だから次世代の正規表現ライブラリと次世代のテキストエディタに期待 ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず 検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) ) 置換:\k'color' 対象テキスト: blue 置換結果:青 現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる 機能は付けないということ テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので 次世代のテキストエディタに期待しましょう >鬼車オリジナルの作者さん 別人だとは知りませんでした^^;
655 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 01:40:37.36 ID:3FykrnoG.net] xyz? を含まないものにマッチする正規表現 www.din.or.jp/~ohzaki/regex.htm#WithoutXY www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ > fmcat =(retofm ..のところで導かれている正規表現は明らかにxyやxyzを含む正規表現だけど これは単なるミスなのかな?こんな難しいことをやってる人がこんなミスを 見逃すとはとても思えないから何か違うものなのかなぁ・・
656 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 03:09:00.10 ID:Rr41G2Hg.net] 明らかに含むって試してから言ってる?
657 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 10:58:06.87 ID:3FykrnoG.net] >>639 > fmcat =(retofm で始まる3行のところの正規表現についてですよ? (〜)* x (〜)* yz の形なので明らかにxyzにマッチします *y(x*[^xy]y*)*x* は誤植でしょうけど・・
658 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 14:05:39.88 ID:pN+YCTD5.net] あー確かににそこはおかしいな 引用っぽいけど
659 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 23:39:54.65 ID:3FykrnoG.net] やっぱり間違いなんですかね? プログラムを使って自動的に算出してるようなのに・・
660 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:18:43.29 ID:0xNuoCxe.net] 俺もわからんけど、prologらしいから、括弧や表記はスタック順になってるとかでは?
661 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:58:15.53 ID:TOnM2DUW.net] >prolog なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは prologとやらの実行ソフト名だったのか https://github.com/RichardMoot/Grail これの使い方を調べれば謎が解けそうですね 暇なときに試してみます、ありがとう
662 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 17:50:41.16 ID:0JYIRqz1.net] 検索対象文字 <test>a="akari"desu</test> 正規表現 a="*" で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?
663 名前:デフォルトの名無しさん [2018/10/06(土) 17:56:12.23 ID:e52HQVrn.net] 馬鹿には無理
664 名前:デフォルトの名無しさん [2018/10/06(土) 18:01:22.57 ID:FAIH8E2E.net] a=\".*\" メタ文字(ダブルクォート)をバックスラシュでエスケープ .(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ とりあえずイケル それでも意図どおりにマッチングしないことは予見できる
665 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 18:14:31.01 ID:OZkGL/sg.net] ワイルドカードと混同しちゃってるのか ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも
666 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 18:16:35.11 ID:OZkGL/sg.net] 正規表現っぽいIDになった?
667 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 18:23:52.49 ID:OZkGL/sg.net] OZk G L /sg ohzakiさんゲームのリンク な気がしたので貼る、最近更新したばっかりやん ゲーム関係のリンク www.din.or.jp/~ohzaki/game.htm
668 名前:デフォルトの名無しさん [2018/10/14(日) 12:53:05.30 ID:zaukh1NH.net] >>645 ワロタw 正規表現の*とワイルドカードは違うぞ。詳しくはググれ。 多分a="[^"]*"でいけると思うけど詳しくはググれ。
669 名前:デフォルトの名無しさん mailto:sage [2018/10/14(日) 14:33:15.06 ID:eP/1gSav.net] ちょいと質問させて a="[^"]*" と書くことが多いんだけど a=".*?" と書くのとで結果に違いでるのかな? <
670 名前:デフォルトの名無しさん mailto:sage [2018/10/14(日) 14:56:27.64 ID:EqzxaMkD.net] ""のなかに改行が含まれてた場合、違いが出るよ
671 名前:デフォルトの名無しさん [2018/10/14(日) 15:11:22.83 ID:zaukh1NH.net] あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry
672 名前:デフォルトの名無しさん mailto:sage [2018/10/14(日) 15:27:34.24 ID:eP/1gSav.net] >>653-654 なるほど、ありがとうございました
673 名前:デフォルトの名無しさん mailto:sage [2018/10/14(日) 22:51:29.78 ID:yTLvFK6H.net] 1、<test>a="[^\"]*"</test> 2、<test>a=".*?"</test> この2つが↓これにどうマッチするか試してごらん --------------------------------------------------------------------------- <test>a="pokemon"(^-^)</test> <test>a="doramon"</test> ----------------------------------------------------------------------------
674 名前:650 mailto:sage [2018/10/14(日) 23:38:50.12 ID:wMwKNjnw.net] >>656 サンプルありがとう でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う
675 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 00:13:04.80 ID:fKW/Yset.net] この誤爆のことに注意を払えているなら .*? で問題ないよ [^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり
676 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 22:36:58.63 ID:fKW/Yset.net] # 文字列 xy を含まない正規表現 $states = 3; @matrix = ( # E A p q ※ A は求める答え [qw(X X E E)], # A = p + q = pε + qε [qw(E X [^x] [^xy])], # p = p[^x] + q[^xy] + ε [qw(X X x x)], # q = px + qx );
677 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 22:37:39.83 ID:fKW/Yset.net] # 文字列 xyz を含まない正規表現 $states = 4; @matrix = ( # E A p q r ※ A は求める答え [qw(X X E E E)], # A = p + q + r = pε + qε + rε [qw(E X [^x] [^xy] [^xz])], # p = p[^x] + q[^xy] + r[^xz] + ε [qw(X X x x x)], # q = px + qx + rx [qw(X X X y X)], # r = qy );
678 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 14:54:58.45 ID:s3Db0e4D.net] y*(x*[^xy]y*)*x* について考察 左右対称形、後ろから読めば yx を含まない正規表現になる x の後ろでは [^xy] しかマッチ出来ないようになっている {[^x]|x+[^xy]}*x* # 状態遷移図から導かれる正規表現 # ※ ここでは見やすいように ( ) を { } としている # 最後の x* は状態 0 から状態 1 への遷移を表している [^x]*{x+[^xy][^x]*}*x* # 分岐の繰り返し ( | )* の展開 ([^xy]|y)*{x+[^xy]([^xy]|y)*}*x* # [^x] を ([^xy]|y) に分解 y*{x*[^xy]y*}*x* # x+ を x* にすると中央の [^xy] が分解した [^xy] と # 同じを動作するので分解した [^xy] を消せる、完成
679 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 23:54:36.85 ID:s3Db0e4D.net] こっちのほうがスマートだ.. # 状態遷移図から導かれる正規表現 ([^x]|x+[^xy])*x* # [^x] を分解し、[^xy] と y にする ([^xy]|y|x+[^xy])*x* # [^xy] と x+[^xy] を1つにまとめる (y|(x+)?[^xy])*x* # (x+)? は x* に書き換えられる (y|x*[^xy])*x* # 分岐ループを展開して完成 y*(x*[^xy]y*)x*
680 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 20:45:04.19 ID:WB0b2hD6.net] (a|b|c)* の展開についての考察 # (b|c) を1つのパーツと考えて {a|(b|c)}* を展開する a*{(b|c)a*}* # 分配の法則 a*{ba*|ca*}* # 再び (x|y)* の形が現れたのでここを展開する a*(ba*)*{ca*(ba*)*}* a=123、b=456、c=789 とすると ^(123)*(456(123)*)*(789(123)*(456(123)*)*)*$
681 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 19:43:06.22 ID:7AODCPK7.net] (a|b|c|d)* の展開についての考察 a*(ba*)*{ca*(ba*)*}* の a は全て a* の形になっているのでこれを利用する a を (a|d) に置き換えることで分岐を1つ増やす (a|d)* = a*(da*)* なので a* を a*(da*)* に置き換えるだけで答えが求まる a*(da*)*(ba*(da*)*)*(ca*(da*)*(ba*(da*)*)*)* (a|b|c|d|f)* を求めたいときは同じように a* を置き換えるだけで求まる このように a* は分岐を無限に増やす入り口のような役割をする
682 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 23:04:31.26 ID:mkrTRrBN.net] このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ もうこれでサクラエディタのGrepはお役御免にできるかもしれない なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに 「鬼雲検索」 を名乗るのはどうなんだろう
683 名前:662 mailto:sage [2018/10/22(月) 01:40:50.08 ID:oA8lJo/T.net] >>665 ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ? 動かないのがあるならこちらで検証するよ〜
684 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2018/10/22(月) 07:15:14.86 ID:nc1bV2B+.net] 全角スペースを\u3000と書いた場合とか bregonigだとperl互換じゃない書き方は受け入れてもらえないわけで
685 名前:662 mailto:sage [2018/10/22(月) 14:03:03.71 ID:oA8lJo/T.net] 自分は文字コードの知識が無いので迂闊なことは言えないから ちょっと調べたことだけ書いておくね ここで k-takata.o.oo7.jp/mysoft/bregonig.html \u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
686 名前:662 mailto:sage [2018/10/22(月) 21:23:16.87 ID:oA8lJo/T.net] サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした サクラエディタ向けの正規表現を作るときには気を付けないといけないな
687 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 23:33:25.25 ID:aIOUU5bU.net] bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ ちょっと難癖に近いなとは自分でも思ってる \sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること サクラに限らないんじゃないかね
688 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:10:38.63 ID:W9szHIq5.net] I/Fの問題だろう Onigmoの仕様では、\sは Unicode以外の場合: \t, \n, \v, \f, \r, \x20 Unicodeの場合: 0009, 000A, 000B, 000C, 000D, 0085(NEL), General_Category -- Line_Separator -- Paragraph_Separator -- Space_Separator ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに依存する。 とある 実際、サクラエディタで試すと、 2028(LS),2029(PS), 0009,000a,000b,000c,000d,0085, 0020,00a0,1680,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,200a,202f,205f,3000(SS) がマッチする なので、サクラエディタはUnicodeで鬼雲を使ってると思われる Janeの場合でも、StyleはSJISであり、XenoはUnicodeなので https://egg.5ch.net/test/read.cgi/software/1536058236/515 に対して、\d{6}がマッチするのはXenoのみである
689 名前:662 mailto:sage [2018/10/23(火) 00:11:35.27 ID:FESm7ID8.net] なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから ruby を使い慣れてる人にとっては歯がゆいと.. > \dに全角数字がマッチしちゃって ですね〜、(?a) で防げるようなので覚えておきます
690 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:18:39.55 ID:FESm7ID8.net] レスが被ってしまった.. >>671 ありがとうございます サクラエディタはUnicode仕様で動いているんですね う〜ん、文字コードの話は難しいなぁ
691 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:24:56.92 ID:W9szHIq5.net] なおUnicodeの空白でも、上記のCc(0009〜0085)、LS,PS,Zs(Space Separator) 以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった さすがは仕様どおりだ
692 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 01:02:05.21 ID:FESm7ID8.net] > 200b,200c,200d,FEFF サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず # 主要部 (?&sp) # 定義部 (|(?!) (?<sp> (?u) [\x{200b}\x{200c}\x{200d}\x{FEFF}\s] ) ) 自分がこれ使うことは永遠になさそうだけどとりあえず..
693 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 03:03:21.50 ID:FESm7ID8.net] >>3 ジオから移転 正規表現パズル https://oraclesqlpuzzle.ninja-web.net/regex/index.html
694 名前:デフォルトの名無しさん [2018/10/25(木) 14:38:08.86 ID:4OmhnPU0.net] あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください 例えばこんな入力のリストがある場合 aaa aaa/bbb/ccc aaa/bbb/ccc/ddd/eee/fff で各リストに対して2階層目までを取得したい場合 aaa aaa/bbb aaa/bbb となるのが期待値です。 ((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
695 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 15:23:45.93 ID:RdSksp9Y.net] >>677 正規表現はプログラム言語や正規表現オブジェクトのオプションによって 動作がけっこう変化するので質問するときはそういうの書いてね [^/]+(?:/[^/]+)? ただしこれは正しいパスが与えられることを前提としているので注意
696 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 15:29:23.12 ID:ZE3NVml1.net] / の数が、0〜2
697 名前:デフォルトの名無しさん [2018/10/25(木) 15:39:26.06 ID:5Cy/pQlU.net] ./ で始まってたらどう数えるん / で始まってたら?
698 名前:デフォルトの名無しさん [2018/10/25(木) 17:47:09.80 ID:4OmhnPU0.net] >>678 ありがとうございます、perlが希望でしたので次回から書くようにします 例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか? [^/]+(?:/[^/]+){0,n-1}
699 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 18:40:41.61 ID:RdSksp9Y.net] ああ、N階層までのマッチという質問だったのか、ごめんね それで合ってるよb
700 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 10:18:13.83 ID:MwloQati.net] 暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった 例、\1 を空文字にマッチさせて再帰の無限ループを狙う ()(?<name>a|\1\g<name>c) 例2、<x> を複数使ってマッチするのが空文字ではないように見せかける (?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
701 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 23:39:01.03 ID:MwloQati.net] ・perl 5.22 if ( "a" =~ /^\Fa\E$/ ) { print "match.\n"; } else { print "no.\n"; } # 結果: match. ・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL) 検索欄: ^\Fa\E$ テキスト: a 結果: 見つかりませんでした \F の意味が知りたい..
702 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 23:58:52.37 ID:MwloQati.net] perldoc.jp/docs/perl/5.16.1/perlreref.pod#ESCAPE32SEQUENCES > \F \E まで畳み込み文字にします bregonig.dll は Perl 5.14 ほぼ準拠だからまだ未対応らしい
703 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 00:53:19.71 ID:ZnGbnC1U.net] jane2ch.net/community/kako/1299/12999/1299979723.html レス241からの高速化の話題を検証してみた レス243 >1は例えば (?:http://)〜 と、始めの数バイトをグループ化してやると速くなる 検証結果: 速度変わらず レス245 > : の部分で一旦切れるようにすれば条件は平等になると思う > (?:http:|ttp:|tp:) が速いわけではないと分かる 検証結果: 1. 10.345 ms 2. 10.560 ms 3. 05.130 ms 結論: (?:http:|ttp:|tp:) は速かった
704 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 01:36:44.44 ID:ZnGbnC1U.net] <鬼雲のリファレンス> (?<element> \g<stag> \g<content>* \g<etag> ){0} (?<stag> < \g<name> \s* > ){0} (?<name> [a-zA-Z_:]+ ){0} (?<content> [^<&]+ (\g<element> | [^<&]+)* ){0} (?<etag> </ \k<name+1> >){0} \g<element> <とんこ式記述法> \g<element> (?!(?!)tonco (?<element> \g<stag> \g<content>* \g<etag> ) (?<stag> < \g<name> \s* > ) (?<name> [a-zA-Z_:]+ ) (?<content> [^<&]+ (\g<element> | [^<&]+)* ) (?<etag> </ \k<name+1> >) ) リファレンス方式は後ろの {0} を読むまでそこが定義だと分からない main部と定義部の境がはっきりせず読みにくい 対してとんこ式は (?!(?!)tonco 以降が定義部だと分かるので読みやすい (?!(?!)tonco を とんこ で辞書登録しておけば {0} をコピペしなくて済む とんこ式の とんこ とは発案者の名前とのこと
705 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 14:53:16.06 ID:ZnGbnC1U.net] これらの記述法には1つ弱点があり (?<name>ほにゃらら){0} より前に \k<name> が出現すると文法エラーになる 例、 (?<tag>foo \k<name> bar){0} (?<name>ほにゃらら){0} \g<tag> このため定義する順序が限定されてしまう、これは解消されるべき問題である
706 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 15:07:39.92 ID:ZnGbnC1U.net] ↑これの例はおかしいな、このレスは取り消し
707 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 15:36:10.31 ID:ZnGbnC1U.net] 昨日、詳説 正規表現の本を枕の下に置いて寝た 寝ている間に正規表現のパワーがもらえると思ったからだ すると.. 夢に正規表現の神様が現れた 神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」 朝、目覚めると飛び起きてperlを動かしてみた if ( "aa" =~ /(a)${1}/ ) { print "match!!\n"; } else { print "no match..\n"; } 実行結果を見た私は奇跡を見ていた
708 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:54:51.63 ID:ZnGbnC1U.net] revilog.com/2012/08/7939.html > a?[a-z] という正規表現は [b-z]|aa? という正規表現と > 等価であり置換可能 前者は ab にマッチするが後者は... > 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?) > という正規表現と 等価であり置換可能 前者は aA にマッチするが後者は...
709 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 00:52:40.24 ID:BYis7ms7.net] ・ perl 5.22 use strict; use warnings; use encoding "cp932"; binmode STDERR, ':encoding(cp932)'; if ( "アイウエオ" =~ /\p{Katakana}/ ){ print "match!! <$&>\n"; } else { print "no match..\n"; } # 結果: match!! <ア> ・ bregonig.dll (shift_jis) 検索:\p{Katakana} 対象:アイウエオ 結果:見つかりません サクラエディタ (unicode) ではマッチした (?a)\p{Katakana} でもマッチ
710 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 01:00:01.03 ID:BYis7ms7.net] perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな 自分はプログラマじゃないんでさっぱり
711 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 01:09:53.75 ID:BYis7ms7.net] どうやら当たりらしい、unicodeに変換してからマッチしてた if ( "あ" =~ /\x{3042}/ ) # true if ( "あ" =~ /\x{82A0}/ ) # false
712 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 19:52:31.20 ID:BYis7ms7.net] ・再帰の穴を狙う2 (str) (?<name> (?(1)yes|no) \g<name> |inner) ↓これに書き換えると (?(1)yes) → 文法エラー (?(1)|no) → 文法エラー ガードが鉄壁ですごい、ほんと良く出来てるな〜
713 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 16:56:37.48 ID:ZWlmxwfj.net] (?(条件)真の式|偽の式) の不具合を発見 () に "?:" を付けるかどうかで結果が変わってしまう 対象テキスト: 13 に対し、 1、 \A(?<name>1)(?(<name>)(2|3))\z 結果:マッチ 2、 \A(?<name>1)(?(<name>)(?:2|3))\z 結果:みつかりません bregonig.dll (shift_jis, unicode 両方で確認) ちなみに対象テキストを 12 にするとどちらもマッチする
714 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 17:14:05.35 ID:ZWlmxwfj.net] やっぱりこれ欲しいなぁ 検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) ) 置換:\k'color' 対象テキスト: blue 置換結果:青 これの有無で便利度が数段変わるんだよね これの代わりに複数回の置換を行うと \G を使うときに困る 同じものを複数回検索するので速度低下に繋がる
715 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 19:55:08.08 ID:ZWlmxwfj.net] ・ (?'name=~' ) 変数name の中身をマッチテストする先読みの親戚のようなもの (?'name' <div> .*? </div> ) (?: (?'name=~' \A .* abc .* \z) pattern1 # タグの間に abc があるとき | (?'name=~' \A .* def .* \z) pattern2 # タグの間に def があるとき | pattern3 # それ以外のとき ) これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
716 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 00:56:07.61 ID:+M+OiFJp.net] 動画を正規表現に変換 https://www.youtube.com/watch?v=em8UvwCTWwk 検索: ^(.*)タマ(.*)タマ(.*)
717 名前:$ 置換: $1$2$3 [] [ここ壊れてます]
718 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 01:35:03.88 ID:zrOHiVOt.net] ニュタマーハタマーフ
719 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:25:34.93 ID:+M+OiFJp.net] (*^-^*)
720 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:34:43.67 ID:+M+OiFJp.net] >>696 のバグがrubyでも起こることを確認 ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32] 原因は bregonig.dll でなく Onigumo にあるようだ これは気付きやすい部類のバグだと思うんだけど 今までバグ報告が無かったようなのが不思議 takata神はここ見てるのかな
721 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:41:25.59 ID:+M+OiFJp.net] # ruby動作確認用コード if '13' =~ /\A(?<name>1)(?(<name>)(?:2|3))\z/ # if '13' =~ /\A(?<name>1)(?(<name>)(2|3))\z/ p 'yes' else p 'no' end
722 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:04:15.23 ID:dBKH7CcG.net] >>693 perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に 正しく復号しないと正規表現クラスを正しく使えない。
723 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 01:26:49.16 ID:XP4jtOby.net] >>704 解説ありがとうございます ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に 対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
724 名前:デフォルトの名無しさん [2018/11/05(月) 20:41:07.84 ID:SJelCvn/.net] >>685 畳み込み文字ってなんですか?
725 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 23:47:01.14 ID:xCFT0arz.net] (?: ( V ) > (0 -1) | ( . ) > (1 0) ) 俺も分からん
726 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 18:39:37.29 ID:4TN3vyid.net] <正常> (1)? (?(1)(?:2|3)|4) (1)? (?(1)(?:2|3)|(?:4|5)) (1)? (?(1)2|(?:3|4)) (1)? (?(1)(2|3)) (1)? (?(1)(?>2|3)) ---------------------------- <異常> (1)? (?(1)(?:2|3))
727 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 19:30:27.97 ID:4TN3vyid.net] <異常> (1)? (?(1)(?:2|(3))) 置換: [$2] 対象テキスト: 3 結果: [3] ----------- <正常> (1)? (?(1)(?>2|3)|4) (1)? (?(1)(?>2|3)|(?>4|5))
728 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 19:36:59.61 ID:4TN3vyid.net] >>709 の実験でバグの原因が分かった 1、不要なカッコを取り除く処理が (?: ) を取り去った 2、分岐の "|" の意味合いが変わってしまった ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
729 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 18:21:43.84 ID:BZlL2mTg.net] perl5.14 # 1文字が2文字にマッチ if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
730 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 18:52:26.91 ID:BZlL2mTg.net] if ( "K" =~ /\A\x{212A}\z/i ) true if ( "K" =~ /\A\x{212A}\z/il ) false
731 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 21:22:21.15 ID:BZlL2mTg.net] if ( "\x{212A}" =~ /[[:print:]]/ ) true if ( "\x{212A}" =~ /[[:print:]]/a ) false
732 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 00:04:00.21 ID:EY2CMtcP.net] \d{0,32766} # ok \d{0,32767} # error "Quantifier in {,} bigger than 32766 in regex;"
733 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 00:21:29.46 ID:EY2CMtcP.net] # \d{0,} は 32766回 を超えてマッチ可能 my $str = ""; for ( $count = 0; $count < 33000; $count++) { $str = $str."0"; } print "\$str\.length = " , length($str) , "\n"; if ( $str =~ /\A\d{0,}\z/ ) { print "true\n"; } else { print "false\n"; } # 結果 # $str.length = 33000 # true
734 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 18:21:06.77 ID:EY2CMtcP.net] # 検索表現の途中にある \G をマッチさせる my $str = 'abcde'; $str =~ /abc/g; if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
735 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 00:16:05.06 ID:QabZTjVa.net] # (?1) の直前に (?i) を置いても効かない if ( "Aa" =~ m/(?i)(A)(?1)/ ) { print "true <$1>\n"; } else { print "false\n"; } # 結果:true <A> if ( "Aa" =~ m/(A)(?i)(?1)/ ) { print "true <$1>\n"; } else { print "false\n"; } # 結果:false
736 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 05:19:20.83 ID:QabZTjVa.net] ## (?{code}) を使って >>697 の置換 if ( "ybrybrb" =~ / \A (?| (?<赤>r)(?{ "aka"; }) | (?<青>b)(?{ "ao"; }) | (?<黄>y)(?{ "ki"; }) )* brybrb ## バックトラックに対応出来るか試す \z /x ) { print "true. Color <${1}> is <${^R}> .\n"; } else { print "false.\n"; } ## 結果: true. Color <r> is <aka> . ## バックトラックの対応、成功
737 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 21:32:36.34 ID:QabZTjVa.net] # 仲間外れを探せ if ("\x{1990}" =~ / \N{U+1990} #\N{1990} #\N{NEW TAI LUE LETTER HIGH NA} /x){ print "match.\n"; } else { print "false.\n"; }
738 名前:デフォルトの名無しさん [2018/11/14(水) 10:41:07.07 ID:Hh1ptiAj.net] 717
739 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 14:37:49.07 ID:duOGmOFb.net] ワロタw
740 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 18:45:40.17 ID:I91AeKub.net] このクイズだか検証だかよくわからんの書き連ねてるのは何なの? 一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
741 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:41:31.78 ID:cpUdYoRF.net] 正規表現の勉強をしながら気付いたことをメモってるだけです 基本的には一人でやってます 仲間が欲しい...
742 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:44:34.67 ID:CNd6PM4x.net] ここはお前のチラシの裏なのか ある程度まとまってんならともかくメモ書きなら他所でやれよ
743 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 00:11:59.19 ID:Ow4iH1sO.net] 需要ないかな?無いならやめます
744 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 22:32:34.48 ID:IM0UsOCP.net] 無いよ
745 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 17:20:00.59 ID:eADG8kUk.net] bregonig.dll の (?a)\w の処理速度が遅い (?u)\w と同じ速さ \s や \d や [a-zA-Z_] より4倍の遅い 改善の余地ありそうだね
746 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 03:22:15.33 ID:YADh6pBI.net] ## (?(R1)yes|no) のサンプルコード if ("abc23yz" =~ / \A ( # $1 ( # $2 a(?1)z | b(?2)y | c(?(R1)1|2)(?(R2)3|4) ) # $2 ) # $1 /x){ print "match. <$&> \n"; } else { print "false.\n"; } # 結果: match. <abc23yz> # aとzの間にあるcは (?1) の中でマッチしているが # bとyの間でもあるため (?2) の中でもある # この場合はcを直接覆っている (R2) だけがyesになる # 直接でない (R1) はnoになる
747 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 12:49:09.25 ID:Oiq/x6oK.net] いつまで続くの?
748 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 19:34:31.80 ID:CU3gUCH4.net] ●Regular Expressionの使用環境 C# ●検索か置換か? 置換 ●説明 先頭の全角スペースのみを置換したい 先頭の全角スペースは1文字の場合もある ●対象データ ああああ あ あ あ あ あ ●希望する結果 空空空ああああ あ あ あ あ あ
749 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 23:39:43.26 ID:UsYfXb0d.net] >>730 Regex.Replace(str, @"(?<=^\s*)\s", "空");
750 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 23:41:52.91 ID:UsYfXb0d.net] あ全角スペースか \sを全角スペースに変えて
751 名前:デフォルトの名無しさん mailto:sage [2018/11/22(木) 01:15:55.43 ID:YNRtrxPu.net] 可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな https://ideone.com/4l8abQ
752 名前:729 mailto:sage [2018/11/22(木) 03:09:11.69 ID:YAZbwzDX.net] >>733 たしかにそっちの方が倍くらい速かった ちなみに正規表現関係ないけど var trimed = str.TrimStart(' '); var replaced = new string('空', str.Length - trimed.Length) + trimed; とか var sb = new StringBuilder(str); for(int i = 0; i < sb.Length; i++) if (sb[i] == ' ') sb[i] = '空'; else