1 件の投稿を表示中 (合計 7 個)
  • 作成者
    投稿
  • #3840
    roku
    メンバー

    いつも大変お世話になっております。

    str|str1|str2 という正規表現で単語のみ検索すると、
    str は該当しますが str1 と str2 は該当しません。->(1)
    str1|str2|str と順番を変えると全て該当します。->(2)
    str[12]? では全て該当します。->(3)

    (2)、(3) が正しいと思うのですが、違いがあるのでしょうか。
    Professional Version 6.00.2 を使っています。

    #3841
    ShuHei
    メンバー

    使い方の違いとなります。

    正規表現str|str1|str2で検索した場合左から順番に
    マッチするかどうかを試します。
    この場合だと一番左のstrが先にマッチするので
    str1,str2もマッチしますが、左の項目を優先するので結果的に対象にはなりません。
    (yunokiさん注釈どうもです。)

    なのでstr,str1,str2どれもマッチさせたいなら
    (3)を用いるのが良いということですね。

    #3842
    yunoki
    メンバー

    この検証結果って強調表示されるかされないかだけの基準の話であって、ヒットそのものはしてますよね。

    #3845
    roku
    メンバー

    ご回答ありがとうございます。

    str1 がマッチするかどうかを判定する際に、
    下のような手順になっているようですね。

    (1) -> str1 の str の部分がマッチ -> 単語でない -> マッチせず
    (2) -> str1 全体がマッチ -> 単語である -> マッチする

    使う側から見ると、(1) と (2) は同じ結果になって欲しいのですが、
    左から順に判定されることを考慮する必要があるのですね。
    いずれにしてもこの例では (3) が確実ですね。

    仮に、単語の先頭の正規表現を とすると、
    単語のみ検索する場合には、 を検索するようです。
    私が想定していたのは || でした。

    それから、「ファイルから検索」でも同じ結果になるので、
    強調表示されていないだけではなく、ヒットしていないようです。
    ありがとうございました。

    #3846
    ShuHei
    メンバー

    あれ、よくよく考がえてみたらそれってなんか腑に落ちない気もしますね。

    「単語のみ検索」って今回の件まで一回も使った事がなかったので気づきませんでしたが、潜在的な落とし穴が多そうですねぇ~

    仮に、単語の先頭の正規表現を とすると、
    単語のみ検索する場合には、 を検索するようです。
    私が想定していたのは || でした。

    すいません、ちょっと仰られてることが分かりません。


    ・||
    この二つの正規表現はマッチする箇所は一緒ですよ。
    (私はのほうがより良いと思いますが)

    因みに大なり小なりはエスケープする必要はありません。

    #3848
    roku
    メンバー


    ・||
    この二つの正規表現はマッチする箇所は一緒ですよ。

    ご指摘の通り同じですね。 。

    試しに JavaScript マクロで
    下の正規表現で検索してみたところ、

    ・b(str|str1|str2)b —> (4)
    ・b(str1|str2|str)b —> (5)
    ・bstr[12]?b ———> (6)

    (4)、(5)、(6) とも結果は同じで、
    str, str1, str2 の全てにマッチしました。

    (1)、(2)、(3) も (4)、(5)、(6) と同じ結果になる事を
    予想していたのですが、(1) は違う結果になりました。

    EmEditor の検索では、正規表現の検索と、
    単語かどうかの判断が別の段階で行なわれている
    ために、(1) が (4) と同じにならないのでしょうか。

    (1) が (4) と同じ結果になって欲しいのですが、
    当面はなるべく (3) を使うようにします。
    ありがとうございました。

    #3957
    匿名
    ゲスト

    正規表現のときに、単語のみと言うチェックボックスはそもそも無効にすべきだと思うんですよね。
    はっきり言って訳がわからないというか、混乱するだけだと思います。
    正規表現だと 単語境界用の b があるのだから、それで記述させたほうが分かりやすいし、細かいこと出来るわけですし。

    v3で正規表現を搭載した時に、元々あった検索ダイアログに無理やり詰め込んだ感が否めないです。

    極端な話、私なんかは、
    /foobar/i
    と検索ダイアログに書いたら、大文字小文字区別せず正規表現として検索できたら、
    「正規表現と大文字小文字」のチェックボックスすらなくせて、すっきりするのになぁと思ったりすることも。
    (もちろん考えないと駄目なことも出てきますが。)

    正規表現用検索と通常の検索は分けても良いんじゃないかと思うこともあります。
    例えば、正規表現検索バーとかなら、/foobar/i とかで書けるとかして、検索ダイアログは正規表現なくしてもいいかなぁと。

    正規表現関連は、まだまだバグと言うか挙動変なところ多いと思いますね。
    特にちょっと込み入った正規表現になると、明らかにPerl やJavaScriptの正規表現とマッチングが異なることが良くあります。
    v3 v4 の頃に比べたらかなり良くなりましたけれども。

    :-D
    ちょっと横道それまして、すみません。

1 件の投稿を表示中 (合計 7 個)
  • このトピックに返信するにはログインしてください。