¿Por qué Vim regex no permite más de 9 grupos de captura?


16

De :h E65podemos 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.


2
Tal vez no solo esté relacionado con Vim: stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4: ¡Interesante! Entonces, tal vez las personas que crearon estas herramientas consideraron que más de 9 grupos eran inútiles ...
statox

Supongo que este límite proviene de vi, que heredó el límite de ed / sed. Hace algunos años, hice un parche para admitir hasta 99 grupos, pero no estaba incluido
Christian Brabandt

1
@ChristianBrabandt Una adición más útil sería implementar indicadores numéricos como en sed: s/.../.../3reemplazaría solo la tercera aparición del patrón. Esta es probablemente la característica que más extraño en Vim.
Sato Katsura

2
Apoyar capturas con nombre sería otra forma de aliviar este problema. Dicho esto, la mayoría de las veces que he visto cerca de 9 grupos de captura fue cuando las personas no sabían que podían usar grupos sin captura \%().
jamessan

Respuestas:


24

La razón obvia es que los grupos con dos o más dígitos son ambiguos: ¿ \12deben tomarse como el grupo 12 o como el grupo 1 seguido de la cadena 2?

Hay otras razones relacionadas con la eficiencia (tiempo de coincidencia exponencial y similares). Estos fueron un espectáculo cuando edse escribió. Se han descubierto mejores algoritmos desde entonces.


Esta es una buena posibilidad, ¿tiene alguna referencia / lectura al respecto?
nobe4

2
@ nobe4 Para la parte de ambigüedad: no, pero IMO es obvio. Para la parte de eficiencia, tendrías que leer sobre las primeras implementaciones de expresiones regulares. Era un problema bien conocido en ese momento. No tengo citas exactas, pero no deberían ser difíciles de encontrar.
Sato Katsura

De hecho, eso suena totalmente plausible.
statox

44
Sí, es casi seguro que el analizador fue escrito para buscar un solo dígito después de la barra invertida, y nunca cambió. Esto era bastante común, hace mucho tiempo. Otros idiomas han encontrado formas de evitar esto (por ejemplo, solo considerando \11una 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.
hobbs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.