Vim regulärer Ausdruck, um alle bis auf die letzten beiden Ziffern der Zahl zu entfernen

8

Ich habe folgenden Text in einer Datei

%Vor%

Ich habe versucht, den obigen Text mit dem Befehl

zu ersetzen %Vor%

Ich bekomme 89 . Sollte es nicht 6789 sein? Kann mir jemand sagen, warum es 89 ist.

    
chappar 14.01.2009, 11:32
quelle

5 Antworten

1

Gruppe 3 ist als 2-stellig definiert. Wenn Sie die letzten 4 Ziffern, die Sie wollen, mit \(\d\d\d\d\) ohne * am Ende abgleichen möchten. Wenn du nur alle Ziffern außer den ersten 4 abgleichen möchtest, setze dein * in die Gruppenübereinstimmung und nicht nach außen.

    
tddmonkey 14.01.2009, 11:38
quelle
4

Wie beschrieben, erfasst Ihr Regex eine Ziffer, dann drei Ziffern und dann eine beliebige Anzahl von Gruppen mit jeweils zwei Ziffern. Die dritte Übereinstimmung wird daher immer zweistellig sein, wenn sie existiert. In Ihrem speziellen Testfall ist die '89' in \ 4, nicht \ 3.

Ändern der Regex zu

%Vor%

gibt Ihnen '6789' als Ergebnis, da es zwei oder mehr Ziffern (bis zu so vielen wie dort) in der dritten Gruppe erfasst.

    
Dave Sherohman 14.01.2009 11:58
quelle
4

Sie möchten hier eine nicht erfassende Gruppe verwenden, so

%Vor%

, die 6789 als Ergebnis liefert, und wenn die Eingabe in

geändert wurde %Vor%

würde die Zeile in 278

ändern     
Hasturkun 14.01.2009 12:32
quelle
0

Sie möchten wahrscheinlich (benötigen eine zusätzliche Umbruchgruppe):

%Vor%

Obwohl ich nicht sicher bin, warum Sie die ersten beiden Gruppen erfassen.

    
orip 14.01.2009 12:35
quelle
0

Ich habe dieses in nvi versucht und es funktioniert nicht. In vim funktioniert es nur, dass Sie den letzten umgekehrten Strich vor dem g korrigieren müssen, für einen Strich, wie folgt:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>//g

und es wird durch 89 ersetzt. Der Grund ist, dass Sie mit dem * sagen, dass das letzte \ d \ d null, einmal oder mehrmals wiederholt werden kann, und mit & gt; Sie sagen Endwortgrenze. Mit der Gruppe 3 sagst du, dass du die Las-Gruppe willst, aber wegen der * beiden Ziffern (\ d \ d) sind es 89. Das * & gt; Sie können 6789 bekommen. So:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)//g

Achten Sie auf die & gt; wer spielt da eine heikle Rolle weil:: 1,$s/\(\d\)\(\d\d\d\)\(\d\d\)\>/ Du bekommst 2389 LOL! Weil vom Ende der Wortgrenzenperspektive dddddd mit 456789 übereinstimmt und es durch die letzten zwei dd ersetzt wird, und das ist 89. Sie erhalten also 23 + 89 Unglaublich! LOL

    
Gaston 31.05.2010 10:59
quelle

Tags und Links