2017-02-17 2 views
1

Ich versuche, den Pfadbegrenzer von Windows zu Linux-Stil zu ändern, aber nur in bestimmten Codezeilen. Um die spezifischen Linien zu finden, ist das kein Problem, aber ich möchte den Austausch automatisieren.Reguläre Ausdrücke, Pfad von Windows zu Linux in bestimmten Situationen

IDE: Eclipse

Jeder Pfad zu ändern, hat eine Kopie Anweisung, zum Beispiel:
copy "path\to\..\file.cpy".

Regex suchen: (copy[\s]+")[(..|[\w]+)[\\]]+(.cpy")

Problem, bekomme ich nur den Anfang und das Ende einer Zeile: $ 1 ist der Kopie " Teil, der $ 2 ist der .cpy" Teil. Ich habe keine Ahnung, wie man die verschiedenen Ordner bekommt.

Antwort

1

Sie brauchen diese Art von Muster, das die \G Funktion verwendet, die am Anfang des Strings oder an der Position nach dem vorherigen Spiel gelingt:

pattern: ((?:\G(?!\A)|copy\s+")[^\\"]*)\\ 
replacement: $1/ 

Details:

(# capture group 1 
    (?: # non capturing group with two possible starts 
     \G  # contiguous to the previous match or the start of the string 
     (?!\A) # disallow the start of the string to match 
     |  # OR 
     copy\s+" #"# first match 
    ) 
    [^\\"]* #"# all that isn't a backslash or a double quote 
) 
\\ # the literal backslash 

Bei der Anfang (vor der ersten Übereinstimmung) die erste Verzweigung fehlschlägt (wegen der Assertion \G), nur der zweite Zweig kann erfolgreich sein. Sobald dies erledigt ist, kann der erste Zweig erfolgreich sein.

Sobald die letzte Backslash erreicht ist, wird die Kontiguität gebrochen (dh: der erste Zweig nicht, nicht mehr und den einzigen Weg für das Muster des zweite Zweig erfolgreich gelingen kann, ist usw.

. Hinweis: wenn Sie wollen sicherstellen, dass Sie Ihren Weg mit der .cpy Verlängerung endet, müssen Sie im zweiten Zweig diese Bedingung mit einer vorwärtsgerichteten Behauptung hinzu:

((?:\G(?!\A)|copy\s+"(?=[^"]\.cpy"))[^\\"]*)\\ 
+0

Danke, sah nie die \ G-Funktion vor – inquisitive