Warum erlaubt Vim Regex nicht mehr als 9 Erfassungsgruppen?


16

Aus können :h E65wir ersehen, dass Vim nicht mehr als 9 Erfassungsgruppen in einem Ersetzungsbefehl zulässt.

Zum Beispiel wird der folgende Befehl funktionieren:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1

Aber diese mit einer weiteren Erfassungsgruppe wird fehlschlagen:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1

Meine Frage ist nicht, warum es fehlschlägt (es ist ein hartes Vim-Limit), sondern warum hat Vim dieses Limit überhaupt?

Ich bin mir auch bewusst, dass ein Regex im echten Leben mit mehr als 9 Capture-Gruppen wahrscheinlich ziemlich monströs zu lesen und zu warten wäre, aber ich bin immer noch neugierig.


2
Vielleicht nicht nur auf Vim bezogen: stackoverflow.com/a/10993346/2558252
nobe4

1
@nobe4: Interessant! Vielleicht hielten Leute, die diese Tools entwickelten, mehr als 9 Gruppen für nutzlos ...
statox

Ich nehme an, diese Grenze stammt von vi, das die Grenze von ed / sed geerbt hat. Vor einigen Jahren habe ich einen Patch für die Unterstützung von bis zu 99 Gruppen erstellt, der jedoch nicht enthalten war
Christian Brabandt,

1
@ChristianBrabandt Ein sinnvollerer Zusatz wäre die Implementierung von numerischen Flags wie in sed: s/.../.../3würde nur das 3. Vorkommen des Musters ersetzen. Dies ist wahrscheinlich die Funktion, die ich in Vim am meisten vermisse.
Sato Katsura

2
Die Unterstützung von Named Captures wäre eine weitere Möglichkeit, dieses Problem zu beheben. Davon abgesehen habe ich in den meisten Fällen 9 Erfassungsgruppen gesehen, als die Leute nicht wussten, dass sie nicht erfassende Gruppen verwenden konnten - \%().
Jamessan

Antworten:


24

Der offensichtliche Grund ist, dass Gruppen mit zwei oder mehr Ziffern mehrdeutig sind: \12Als Gruppe 12 oder als Gruppe 1, gefolgt von der Zeichenfolge 2?

Es gibt andere Gründe im Zusammenhang mit der Effizienz (exponentielle Anpassungszeit und dergleichen). Dies war ein Show Stopper, als edgeschrieben wurde. Seitdem wurden bessere Algorithmen entdeckt.


Dies ist eine gute Möglichkeit. Haben Sie einen Hinweis / eine Lektüre dazu?
Nobe4

2
@nobe4 Für den Mehrdeutigkeitsteil: nein, aber IMO ist es offensichtlich. Für den Effizienzteil müssten Sie sich über die frühen Implementierungen von regulären Ausdrücken informieren. Es war damals ein bekanntes Problem. Ich habe keine genauen Zitate, aber sie sollten nicht schwer zu finden sein.
Sato Katsura

Tatsächlich klingt das absolut plausibel.
statox

4
Ja, es ist fast sicher, dass der Parser so geschrieben wurde, dass er nach einem Backslash nach einer einzelnen Ziffer sucht, und sich nie geändert hat. Das war schon vor langer Zeit üblich. Andere Sprachen haben sich \11eine \g{11}Lösung ausgedacht (zum Beispiel nur , wenn es mindestens 11 davon gibt, was inkonsistent, aber normalerweise in Ordnung ist; und Dinge wie für Rückverweise und ${11}für Substitutionen), aber Vim hat dies nie getan eine davon eingeführt.
Hobbs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.