De :h E65
nous pouvons voir que Vim n'autorise pas plus de 9 groupes de capture dans une commande de substitution.
Par exemple, la commande suivante fonctionnera:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1
Mais celui-ci avec un autre groupe de capture échouera:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1
Ma question n'est pas de savoir pourquoi elle échoue (c'est une limite stricte de Vim), mais pourquoi Vim a-t-elle cette limite?
De plus, je suis conscient qu'un regex réel avec plus de 9 groupes de capture serait probablement assez monstrueux à lire et à entretenir, mais je suis toujours curieux.
regular-expression
statox
la source
la source
sed
:s/.../.../3
ne remplacerait que la 3e occurrence du motif. C'est probablement la fonctionnalité qui me manque le plus dans Vim.\%()
.Réponses:
La raison évidente est que les groupes de deux chiffres ou plus sont ambigus: doivent
\12
être pris comme groupe 12 ou comme groupe 1 suivi de la chaîne2
?Il existe d'autres raisons liées à l'efficacité (temps d'appariement exponentiel, etc.). Ce fut un bouchon de spectacle quand a
ed
été écrit. De meilleurs algorithmes ont été découverts depuis lors.la source
\11
problème (par exemple, ne considérer une référence à une capture que s'il y en a au moins 11, ce qui est incohérent mais généralement correct; et des choses comme\g{11}
pour les références et les${11}
substitutions), mais vim n'a jamais introduit l'un de ceux-ci.