検索の"前"と"次"で、正規表現"(?>pattern)"(原子的式集合)のヒットする回数が違う

  1. 気にするほどのことでもないのですが、正規表現ライブラリのサポートが増えた記念に些末なことを…

    例文:
    __test__test__test__test__
    __test__test__test__test__

    正規表現:
    (?>__test__)

    * 鬼車 (FindOnig=1)
    + "次を検索(N)"だと全部(8回)ヒットしてしまう
    + "前を検索(P)"だとヒットするのは4回

    * 鬼雲 (FindOnig=0)
    + "次を検索(N)"だと全部(8回)ヒットしてしまう
    + "前を検索(P)"だとヒットするのは4回

    ちなみに他のでは…

    * サクラエディタ (bregonig.dll Ver.4.20 with Onigmo 6.2.0)
    検索方向に関係なくヒットするのは4回

    * .NET Framework
    ヒットするのは4箇所

    * Notepad++
    ヒットするのは4箇所

    個人的には4回に統一していただけると嬉しいのですが…

    少なくとも、検索において、行きと帰りでヒットする回数(箇所)が違うというのは
    如何なものなのかなぁ~と思う次第です。

     |  myupon  |  返信
  2. ご報告ありがとうございます。

    マッチする回数が 8 回か 4 回かという点については、[次を検索] を繰り返す場合に、次の文字列をどこを始点として検索するかという仕様次第で、テキストエディターによってその設計思想は様々です。

    Mery の場合は [次を検索] でなるべく取りこぼしを発生させないよう、マッチした文字列から 1 文字ずつ次を検索する方式を採用しているので 8 回マッチします。

    この仕様については、どのエディターが正解といった答えはないと思っていますが、以前にブログ記事のネタとして調査したことがありますのでご興味がありましたらどうぞ。
    https://www.haijin-boys.com/software/mery/mery-2-2-2

    鬼車 (FindOnig=1) については、確かに [次を検索] は 8 回、[前を検索] は 4 回マッチになってますね。

    鬼雲のほうは [前を検索] でも 8 回マッチするようなので、これは FindOnig=0 の設定ミスではないでしょうか?

    > 少なくとも、検索において、行きと帰りでヒットする回数(箇所)が違うというのは如何なものなのかなぁ~と思う次第です。

    これは私も同感です。(上記の参考リンクの記事にも、そんなことを書いてました)

    そういうわけで、鬼車でも [次を検索]、[前を検索] で同じ回数 (この場合は 8 回マッチ) が正しいと思います。

    鬼車の実装はまだ手探りの状態なのですが、逆方向検索が鬼雲と同じ実装方法だと非常に遅かったので、今回、ちょっと別の方法で実装してみたんです。こんな落とし穴があったとは…。

    もっと研究が必要ですね。

     |  Kuro  |  返信
  3. > Mery の場合は [次を検索] でなるべく取りこぼしを発生させないよう、マッチした文字列から 1 文字ずつ次を検索する方式を採用しているので 8 回マッチします。

    なるほど、では無理ですね。

    > この仕様については、どのエディターが正解といった答えはないと思っていますが、以前にブログ記事のネタとして調査したことがありますのでご興味がありましたらどうぞ。
    > https://www.haijin-boys.com/software/mery/mery-2-2-2

    読ませていただきました。
    私も「正しい」を論ずる気はありません。
    ただ、対応ライブラリが増えたとの事だったので「そういえば…」と思い出し試したところ、8回/4回だった…
    で、手を付けるのであれば、4回の方に統一していただけたら嬉しいなぁ~と…
    すみません、その程度です(^_^ゞ

    > 鬼雲のほうは [前を検索] でも 8 回マッチするようなので、これは FindOnig=0 の設定ミスではないでしょうか?

    ??? FindOnig=0 で8回ヒット ???
    …ということなので確かめてみました。

    現在の私の設定ファイルそのままで…

    FindOnig=0
    Oniguruma → バージョン番号あり ← ??
    Onigumo → バージョン番号あり
    ※両方「あり」です

    FindOnig=1
    Oniguruma → バージョン番号あり
    Onigumo → バージョン番号なし

    なるほど、私が確認したのは鬼車だけだったようです。
    そこで、私の設定ファイルを全部他に移動して確認。

    FindOnig=0
    Oniguruma → バージョン番号なし
    Onigumo → バージョン番号あり

    FindOnig=1
    Oniguruma → バージョン番号あり
    Onigumo → バージョン番号なし

    なるほど、おっしゃる通り、鬼雲は行きも帰りも8回でした。
    隠しオプションとかを気ままに設定している所為かな??
    とはいえ、鬼車で不都合ないので、このまま使わせていただこうと思います。

    もちろん、私の設定のままでも
    FindOnig=0 にして
    onig.dll を外しておけば
    鬼雲も使える(行きも帰りも8回ヒットする)ので、そもそも不都合はありません。

     |  myupon  |  返信
  4. > で、手を付けるのであれば、4回の方に統一していただけたら嬉しいなぁ~と…
    > すみません、その程度です(^_^ゞ

    いえいえ、こちらこそ。貴重なご意見ありがとうございます。

    4 回方式への仕様変更はちょっと、長年この仕様でやってきたこともあって難しいのですが、行きと帰りで同じ回数ヒットしないという問題は気づいてなかったので、とても参考になりました。

    > 隠しオプションとかを気ままに設定している所為かな??

    Mery を起動している状態で Mery.ini を書き換えると反映されないので、もしかしたらそれかも?

    > とはいえ、鬼車で不都合ないので、このまま使わせていただこうと思います。

    ありがとうございます。日常で使う用途なら、Mery でも数年の実績がある鬼雲のほうが安心ですが、検証にご協力いただける場合は鬼車、よろしくお願いします!

    しかし、いただいたご意見を参考に逆方向検索の実装を考え直していたところ、鬼車ではなく「鬼雲」のほうももっと美しく実装できるような気がしてきました。

    この土日は逆方向検索を研究してみたいと思います。

     |  Kuro  |  返信
スポンサーリンク