Regex hängt einen String an einen Teil des Matches an

4436
arielnmz

Ich finde das ziemlich schwierig, die Sache ist wie folgt:

Ich habe eine Zeichenfolge in der Form:

GlobalParameters::$docId = DocList::$PARTNERS; 

Und ich möchte den String _VIEW an das Ende des Symbols anhängen . Das Problem ist, dass ich nicht nur PARTNERS, sondern auch jedes andere Symbol anpassen möchte. Ich habe also folgende Regex versucht:

Finden:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$(.*)\; 

Ersetzen mit:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$(.*)_VIEW\; 

Aber ich habe gerade bekommen:

GlobalParameters::$docId = DocList::$(.*)_VIEW; 

Bei allen Spielen. Wie kann ich das umgehen?

1

2 Antworten auf die Frage

0
AFH

Die Hauptsache falsch ist, dass das übereinstimmende Feld durch (und in der Ersetzungszeichenfolge )identifiziert werden muss \1:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$\1_VIEW\; 

Es ist auch erwähnenswert, dass, obwohl Ihre Geany-Implementierung diesen Standard nicht hat, viele Programme, die reguläre Ausdrücke verwenden, standardmäßig den BRE-Modus (Basic Regular Expression) verwenden, der den Such-Teilausdruck erfordert \(und begrenzt \), wie in:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$\(.*\)\; 

Hinweis: Geany ab v1.24 braucht nicht die Klammern entgangen sein, so müssen Sie einfach (und )zu begrenzen passenden Felder.

Andere, einfachere Suchen und Ersetzen-Zeichenfolgen kommen mir vor, aber ohne den Kontext der anderen Zeichenfolgen in der Datei zu sehen, bin ich mir nicht sicher, was befriedigend sein könnte. Folgendes sollte jedoch in Ordnung sein: -

Suche:

\(GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$.*\)\; 

Ersetzen:

\1_VIEW\; 

Hier wird die gesamte Zeichenfolge bis auf die Nachfolge ;angepasst und _VIEWangehängt.

Aber warum müssen die Klammern entkommen? Sie sind nicht Teil der Zeichenfolge, die ich anpassen muss, aber ich werde diese Lösung trotzdem ausprobieren, sobald ich an meinem Computer angelangt bin. Vielen Dank. arielnmz vor 9 Jahren 0
Der Standardwert für viele Programme, die reguläre Ausdrücke verwenden, ist der BRE-Modus (Basic Regular Expression), für den ein Escaping erforderlich ist. Siehe [Wikipedia] (http://en.wikipedia.org/wiki/Regular_expression). Als ich Ihre Saiten mit `sed` getestet habe, brauchte ich die Backslashes. AFH vor 9 Jahren 0
Das wusste ich nicht, aber vielleicht verwendet Geany diesen Modus nicht standardmäßig. arielnmz vor 9 Jahren 0
Ich kenne Geany nicht, also brauchen Sie vielleicht nicht die Back-Slashes, aber Sie benötigen auf jeden Fall "\ 1" im Ersetzungsstrom, um den markierten Unterausdruck zu erweitern. Versuchen Sie es zuerst, und fügen Sie dann bei Bedarf die hinteren Schrägstriche in die Klammern ein. AFH vor 9 Jahren 0
Einfach ausprobiert und wirkt wie ein Zauber! Vielen Dank! Ich wusste wirklich nicht, dass das System von grep passend zu den Feldern passt, ordentlich. Danke nochmal. arielnmz vor 9 Jahren 0
Haben Sie die Back-Slashes mit den Klammern benötigt? Wenn nicht, müsste ich meine Antwort so modifizieren, dass fehlende hintere Schrägstriche nicht als falsch eingestuft werden. AFH vor 9 Jahren 0
Nein, ich musste den Klammern überhaupt nicht entkommen, vielleicht weil Geany das so genannte grep nennt (es verwendet es als internen Befehl für die Zeichenfolgenanpassung). arielnmz vor 9 Jahren 0
Ich habe meine Antwort aktualisiert, um die "falsche" Klassifizierung der Suchzeichenfolge zu entfernen, aber ich habe die Informationen hinterlassen, um anderen mit einem verwandten RE-Problem zu helfen. AFH vor 9 Jahren 0
0
Sebastiano Pera

Um die Antwort von AFH zu erweitern, habe ich ein komplexeres Beispiel gemacht:

Zu ändernde Zeichenfolge:

abc: 123 

Suche:

(abc)\: (123) 

Ersetzen (1def wird an den ersten Übereinstimmungsausdruck und 456 an den zweiten angehängt):

\1def \2456 

Ergebnis:

abcdef 123456