Pourquoi Vim regex n'autorise-t-il pas plus de 9 groupes de capture?

16

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

statox
la source
2
Peut-être pas uniquement lié à Vim: stackoverflow.com/a/10993346/2558252
nobe4
1
@ nobe4: Intéressant! Alors peut-être que les personnes créant ces outils ont considéré que plus de 9 groupes étaient inutiles ...
statox
Je suppose que cette limite vient de vi, qui a hérité de la limite de ed / sed. Il y a quelques années, j'ai fait un patch pour supporter jusqu'à 99 groupes, mais il n'était pas inclus
Christian Brabandt
1
@ChristianBrabandt Un ajout plus utile serait d'implémenter des drapeaux numériques comme dans sed: s/.../.../3ne remplacerait que la 3e occurrence du motif. C'est probablement la fonctionnalité qui me manque le plus dans Vim.
Sato Katsura
2
La prise en charge des captures nommées serait une autre façon de résoudre ce problème. Cela étant dit, la plupart du temps, j'ai vu près de 9 groupes de capture lorsque les gens ne savaient pas qu'ils pouvaient utiliser des groupes non capturants \%().
jamessan

Réponses:

24

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îne 2?

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.

Sato Katsura
la source
C'est une bonne possibilité, avez-vous une référence / lecture à ce sujet?
nobe4
2
@ nobe4 Pour la partie ambiguë: non, mais IMO c'est évident. Pour la partie efficacité, vous devez lire les premières implémentations des expressions rationnelles. C'était un problème bien connu à l'époque. Je n'ai pas de citations exactes, mais elles ne devraient pas être difficiles à trouver.
Sato Katsura
En effet, cela semble totalement plausible.
statox
4
Oui, il est presque certain que l'analyseur a été écrit pour rechercher un seul chiffre après la barre oblique inverse, et n'a jamais changé. C'était assez courant, il y a longtemps. D'autres langues ont trouvé des moyens de contourner ce \11problè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.
hobbs