vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
341 stars 11 forks source link

RegExp 最小マッチ (`.\{-}`) が 正しく動作しないケース がある #1421

Closed KSR-Yasuda closed 1 year ago

KSR-Yasuda commented 1 year ago

不具合の内容

RegExp 最小マッチ .\{-} に対して、 特定のパターンで 最小でないマッチ を拾ってくるケース があるようです。

    (hoge) fuga (piyo)
#   ^^^^^^      ^^^^^^
# (.\{-})  に対しては、ここがマッチ (OK)

    (hoge) fuga (piyo)
#   ^^^^^^^^^^^^^^^^^^
# (.\{-}o) に対しては、ここ全体 がマッチ (NG)

    (hoge) fuga (piyo)
#               ^^^^^^
# 本来は、最小マッチ なので、ここだけ のマッチになるべき

現象・ログ

上記の通り。

再現手順

上記の通り。

期待動作

上記の通り。

Vimのバージョン

OSの種類/ディストリ/バージョン

使用している or 関係していそうなプラグイン

特になし

その他

特になし

kuuote commented 1 year ago

:h non-greedy の結果には しかし、早い位置でマッチするものが、短いマッチよりも優先されます。例えば、"a\{-}b" は "xaaab" の "aaab" にマッチします。 と書かれており、今回のケースは恐らくこれに該当する物だと思われます。

k-takata commented 1 year ago

Vim に限らず他の多くの正規表現エンジンでも同じ仕様です。 括弧を結果に含めたくない場合には .\{-} ではなく [^()]\{-} などのように明示的に除外する必要があります。

KSR-Yasuda commented 1 year ago

なるほど、『X\{-}X を見つけたら、そこから最短のマッチ を見つける』という仕様で、 行頭の ( からの最短 を見つけようとした、ということですね。 理解しました。