Aus können :h E65
wir 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.
regular-expression
statox
quelle
quelle
sed
:s/.../.../3
würde nur das 3. Vorkommen des Musters ersetzen. Dies ist wahrscheinlich die Funktion, die ich in Vim am meisten vermisse.\%()
.Antworten:
Der offensichtliche Grund ist, dass Gruppen mit zwei oder mehr Ziffern mehrdeutig sind:
\12
Als Gruppe 12 oder als Gruppe 1, gefolgt von der Zeichenfolge2
?Es gibt andere Gründe im Zusammenhang mit der Effizienz (exponentielle Anpassungszeit und dergleichen). Dies war ein Show Stopper, als
ed
geschrieben wurde. Seitdem wurden bessere Algorithmen entdeckt.quelle
\11
eine\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.