- 作成者投稿
- 2012年11月20日 3:13 am #11330
ent
参加者以下の2行をEmEditorに張り付けます。
Year
Year2012検索ワードとして以下の文字列を入力します。
(Year|Year2012)検索オプションとして「正規表現を使用」をON、検索。
その結果、強調される文字列は どちらの行も Year のみです。
縦棒|は OR条件なので Year2012 が 強調されないのはおかしいと思われます。
ご確認よろしくお願いいたします。
2012年11月20日 4:12 am #11332Yutaka Emura
キーマスターum1997 様
いつも EmEditor Professional をお使いいただき、誠にありがとうございます。
Year が Year2012 に含まれているため、この動作が正しいです。左側の一致が右側の一致より優先するためです。
Year2012|Year
と記述していただければ、両方がマッチするようになります。
お試しいただければ幸いです。
どうぞよろしくお願い申し上げます。
2012年11月20日 4:50 am #11333ent
参加者検索文字列を書き直したところおっしゃる通りの動作になりました。しかしこれでは検索文字列を何かの文字列から一括でOR(|)で結合して作成する場合にチェック漏れが出てきます。
そもそも OR 検索に優先順位を設けていることはヘルプには書かれておりませんでしたし、
なによりまったく直感的ではありません。「Year が Year2012 に含まれている」と書かれていますが、たとえば以下のような文字列
Year
xYear2012を、正規表現で(Year|xYear2012) として検索した場合、今度はYearにも、xYear2012 にも ヒットするようになります。どのような場合に優先度による条件の切り捨てが行われるのかはっきりしないようでは、仕事にはつかえません。
本来 OR は等価に扱うことが期待されるはずです。
今のような挙動はオプション扱いにしていただけないでしょうか。2012年11月20日 5:39 am #11334Yutaka Emura
キーマスターum1997 様
いつも EmEditor Professional をお使いいただき、誠にありがとうございます。
ドキュメントについては、http://www.boost.org/doc/libs/1_52_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html
を参照していただけると幸いです。
Expression1 | Expression2 のところに、If Expresion1 can be matched then returns that match, otherwise attempts to match Expression2. と書かれています。
Year|xYear2012
とした場合は、x の左側にカーソルが位置する場合は xYear2012 が一致し、Y の左にカーソルが位置する場合は Year に一致するため、両方に一致するのは正しい動作となります。
わかりにくいとは思いますが、ご理解いただけると幸いです。
どうぞよろしくお願い申し上げます。
2012年11月20日 8:14 am #11336ent
参加者ご回答ありがとうございます。
この動作が boost_regex の仕様通りだということで気を付けて使用するようにいたします。ただ今回の点においてはわかりづらく、使いづらいという点は変わりませんので、将来的に、別の正規表現DLLに入れ替える仕組みを搭載するか、挙動の変更オプションなどはございませんでしょうか。
2012年11月20日 4:54 pm #11337Yutaka Emura
キーマスターum1997 様
いつも EmEditor Professional をお使いいただき、誠にありがとうございます。
ご希望のような動作が可能かどうか調べてみます。
どうぞよろしくお願い申し上げます。
2012年11月29日 1:46 am #11354redakt55
参加者横からすみません。
いま広く使われている正規表現エンジンの多くでは,? * + { } などの量指定子は最長一致になり,セレクター(A|B)はそうならないようですね。。
セレクターが最長のものを探索する仕様だと速度が遅くなるので嬉しくないです。どちらか選べるのならいいですが。それはそれとして,正規表現エンジンに鬼雲(Onigmo)か鬼車も選べると嬉しいです。
https://github.com/k-takata/Onigmo/blob/master/README.ja - 作成者投稿
- このトピックに返信するにはログインしてください。