Vim正規表現が9個を超えるキャプチャグループを許可しないのはなぜですか?


16

:h E65我々はVimが置換コマンドで複数の9つのキャプチャグループを許可していないことがわかります。

たとえば、次のコマンドは機能します。

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1

ただし、キャプチャグループがもう1つあるこの例は失敗します。

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1

私の質問は、失敗する理由(Vimのハード制限)ではなく、Vimにこの制限があるのはなぜですか?

また、9個以上のキャプチャグループを含む実際の正規表現は、おそらく読み取りと保守が非常に困難になることを承知していますが、私はまだ興味があります。


2
たぶんVimだけとは関係ありません:stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4:面白い!そのため、おそらく人々は...以上9グループは無用だったと考えられ、これらのツールを作成する
statox

この制限は、ed / sedから制限を継承したviによるものだと思います。数年前、最大99個のグループをサポートするパッチを作成しましたが、含まれていませんでした
クリスチャンブラバンド

1
@ChristianBrabandt Aより有用さらには数値を実装することであろうのようにseds/.../.../3パターンの唯一の第三発生を置き換えます。これはおそらく、Vimで最も見逃している機能です。
佐藤桂

2
名前付きキャプチャのサポートは、この問題を軽減する別の方法です。そうは言っても、ほとんどの場合、9つのキャプチャグループの近くで見たのは、非キャプチャグループを使用できることを人々が知らなかったときでした\%()
ジェームスサン

回答:


24

明白な理由は、2桁以上のグループがあいまいであることです。\12グループ12として、またはグループ1の後に文字列が続くものとして解釈する必要があります2か?

効率に関連する他の理由があります(指数マッチング時間など)。これらedは書かれたときのショーストッパーでした。その後、より良いアルゴリズムが発見されました。


これは良い可能性です。これに関する参照/読書はありますか?
nobe4

2
@ nobe4あいまいな部分については、いいえ、しかしIMOは明らかです。効率の部分については、正規表現の初期の実装について読む必要があります。それは当時よく知られた問題でした。正確な引用はありませんが、見つけるのは難しくありません。
佐藤桂

確かにそれは完全にもっともらしい。
statox

4
はい、パーサーがバックスラッシュの後に一桁を探すように書かれていて、決して変更されていないことはほぼ間違いありません。これは、かなり前のことです。他の言語は、(のみを考慮すると、例えば、この回避する方法を考え出す必要があり\11、矛盾が、通常は大丈夫である、それらの少なくとも11がある場合には、キャプチャを参照すると、前記のようなもの\g{11}後方参照用と${11}置換のため)が、Vimは決してありませんそれらのいずれかを導入しました。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.