2016-05-11 10 views
6

Betrachten Sie die folgende regex:Wie conditionals verwenden, wenn in Notepad ++ über regex ersetzen

([a-zA-Z])([a-zA-Z]?)/([a-zA-Z])([a-zA-Z]?)

Wenn der Text ist: a/b die diesen Gruppen sind:

/1 'a' 
/2 '' 
/3 'b' 
/4 '' 

Und wenn die Text ist: aa/b die einfangenden Gruppen werden:

/1 'a' 
/2 'a' 
/3 'b' 
/4 '' 

Angenommen, ich möchte diese Zeichenfolge in Notepad ++ so finden und ersetzen, dass, wenn /2 oder /4 leer sind (wie im ersten Fall oben), ich c voranstellen.

So wird der Text a/b wird ca/cb. Und der Text aa/b wird aa/cb

ich die folgende regex verwenden zu ersetzen:

(?(2)\1\2|0\1)/(?(4)\3\4|0\3) 

Aber Notepad ++ ist ? wahrsten Sinne des Wortes in diesem Fall zu behandeln, und nicht als eine bedingte Kennung. Irgendeine Idee was mache ich falsch?

+0

Ich denke, Ihre Platzierung der '?' Falsch sein und dies könnte sein, warum Notepad ++ ist sie als Literale behandeln. –

Antwort

7

Die Syntax in dem bedingten Ersatz ist

(?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO} 

Die { und } sind notwendig, um Unklarheiten zu vermeiden, wenn Sie mit Gruppen von mehr als 9 und mit dem Namen Einfanggruppen beschäftigen.

Seit Notepad ++ verwendet Boost-Extended Format String Syntax finden diese Boost documentation:

Der Charakter ? beginnt einen bedingten Ausdruck, die allgemeine Form ist:

?Ntrue-expression:false-expression

wo N Nachkommastelle ist.

Wenn der Unterausdruck N übereinstimmte, wird true-expression ausgewertet und an den Ausgang gesendet, andernfalls wird false-expression ausgewertet und an den Ausgang gesendet.

Normalerweise müssen Sie einen bedingten Ausdruck mit Klammern umgeben, um Mehrdeutigkeiten zu vermeiden.

Zum Beispiel kann der Format-String (?1foo:bar) wird jedes Spiel mit foo, wenn der Unterausdruck gefunden ersetzen $1 abgestimmt wurde, und mit bar anders.

Für Unterausdrücke mit einem Index von mehr als 9 oder für den Zugang zu benennenden Unter Ausdrücke verwenden:

?{INDEX}true-expression:false-expression

oder

?{NAME}true-expression:false-expression

So verwenden ([a-zA-Z])([a-zA-Z])?/([a-zA-Z])([a-zA-Z])? und ersetzen durch (?{2}$1$2:c$1)/(?{4}$3$4:c$3).

Das zweite Problem ist, dass Sie den ? Quantor innerhalb der einfangenden Gruppe platziert haben, so dass das Muster in der Gruppe optional ist, aber nicht die gesamte Gruppe. Das führte dazu, dass die Gruppe immer am Match teilnahm und die Bedingung immer "wahr" war (immer übereinstimmend). ? sollte die Gruppe quantifizieren.

enter image description here

+0

Können Sie auch auf die Dokumentation (falls vorhanden) von Notepad ++ verweisen? – CinCout

+1

Ich habe die Boost-Referenz aufgenommen. –

+0

Vielen Dank – CinCout