Из :h E65
рисунка видно, что Vim не позволяет использовать более 9 групп захвата в команде замещения.
Например, будет работать следующая команда:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\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 группами захвата, вероятно, было бы довольно чудовищно для чтения и поддержки, но мне все еще любопытно.
regular-expression
statox
источник
источник
sed
:s/.../.../3
заменяет только 3-е вхождение шаблона. Вероятно, эта функция мне больше всего не хватает в Vim.\%()
.Ответы:
Очевидная причина заключается в том, что группы с двумя или более цифрами неоднозначны: следует
\12
принимать за группу 12 или за группу 1, за которой следует строка2
?Существуют и другие причины, связанные с эффективностью (экспоненциальное время согласования и т. П.). Это были шоу-пробки, когда
ed
было написано. Лучшие алгоритмы были открыты с тех пор.источник
\11
ссылку на перехват, только если их хотя бы 11, что противоречиво, но обычно нормально; и такие вещи, как\g{11}
обратные ссылки и${11}
замены), но vim никогда представил любой из тех.