De :h E65
podemos ver que Vim no permite más de 9 grupos de captura en un comando de sustitución.
Por ejemplo, el siguiente comando funcionará:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1
Pero este con un grupo de captura más fallará:
s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1
Mi pregunta no es por qué falla (es un límite rígido de Vim) sino por qué Vim tiene este límite.
Además, soy consciente de que una expresión regular de la vida real con más de 9 grupos de captura probablemente sería bastante monstruosa de leer y mantener, pero todavía tengo curiosidad.
regular-expression
statox
fuente
fuente
sed
:s/.../.../3
reemplazaría solo la tercera aparición del patrón. Esta es probablemente la característica que más extraño en Vim.\%()
.Respuestas:
La razón obvia es que los grupos con dos o más dígitos son ambiguos: ¿
\12
deben tomarse como el grupo 12 o como el grupo 1 seguido de la cadena2
?Hay otras razones relacionadas con la eficiencia (tiempo de coincidencia exponencial y similares). Estos fueron un espectáculo cuando
ed
se escribió. Se han descubierto mejores algoritmos desde entonces.fuente
\11
una referencia a una captura si hay al menos 11 de ellos, lo cual es inconsistente pero generalmente está bien; y cosas como\g{11}
para referencias posteriores y${11}
sustituciones), pero vim nunca ha introducido cualquiera de esos.