A partir :h E65
podemos ver que Vim não permite mais de 9 grupos de captura em um comando de substituição.
Por exemplo, o seguinte comando funcionará:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1
Mas este com mais um grupo de captura falhará:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1
Minha pergunta não é sobre por que falha (é um limite rígido do Vim), mas sobre por que o Vim tem esse limite?
Além disso, estou ciente de que uma regex da vida real com mais de 9 grupos de captura provavelmente seria bastante monstruosa de ler e manter, mas ainda estou curioso.
regular-expression
statox
fonte
fonte
sed
:s/.../.../3
substituiria apenas a terceira ocorrência do padrão. Este é provavelmente o recurso que mais sinto falta no Vim.\%()
.Respostas:
A razão óbvia é que os grupos com dois ou mais dígitos são ambíguos: devem
\12
ser tomados como grupo 12 ou como grupo 1 seguido pela sequência2
?Existem outros motivos relacionados à eficiência (tempo de correspondência exponencial e similares). Estes foram uma rolha quando
ed
foi escrito. Algoritmos melhores foram descobertos desde então.fonte
\11
uma referência a uma captura se houver pelo menos 11 deles, o que é inconsistente, mas geralmente correto; e coisas como\g{11}
para referências anteriores e${11}
substituições), mas o vim nunca introduziu qualquer um desses.