Od :h E65
widzimy, że Vim nie pozwala na więcej niż 9 grup przechwytywania w poleceniu substytucyjnego.
Na przykład zadziała następujące polecenie:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1
Ale ta z jeszcze jedną grupą przechwytywania zawiedzie:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1
Moje pytanie nie dotyczy tego, dlaczego zawodzi (jest to twardy limit Vima), ale dlaczego w ogóle Vim ma ten limit?
Wiem też, że regex z więcej niż 9 grup przechwytywania byłby prawdopodobnie potworny do przeczytania i utrzymania, ale nadal jestem ciekawy.
regular-expression
statox
źródło
źródło
sed
:s/.../.../3
zastąpiłoby tylko 3. wystąpienie wzorca. Jest to prawdopodobnie funkcja, za którą najbardziej tęsknię w Vimie.\%()
.Odpowiedzi:
Oczywistym powodem jest to, że grupy z dwiema lub więcej cyframi są niejednoznaczne: czy należy
\12
je traktować jako grupę 12, czy jako grupę 1, po której następuje łańcuch2
?Istnieją inne powody związane z wydajnością (wykładniczy czas dopasowania i tym podobne). Były one przystankiem koncertowym, kiedy
ed
zostało napisane. Od tego czasu odkryto lepsze algorytmy.źródło
\11
odniesienie do przechwytywania, jeśli jest ich co najmniej 11, co jest niespójne, ale zwykle w porządku; i takie rzeczy, jak\g{11}
odniesienia do referencji i${11}
zastępowania), ale vim nigdy nie wprowadził którykolwiek z nich.