2017-02-22 4 views
0

Ich möchte ein kleines Tool zum Konvertieren von Code erstellen.Wiederholen von C# Regex ersetzen

Das meiste davon kann durch Regex getan werden, so dass ich nicht einen tatsächlichen Parser benötigen.

Aber es gibt ein Problem mit sich wiederholenden Mustern. Unterhalb einer vereinfachten Beispiel:

var nl = Environment.NewLine; 
var temp = 
@"Other things 
End 
End 
Other things"; 

temp = Regex.Replace(temp, @"(\r\nEnd\r\n)+",@"" + nl + "}" + nl + ""); 

Dies wird

Other things 
} 
End 
Other things 

zurückkehren So ist das zweite Ende nicht ersetzt. (Außer wenn ich die gleiche Regex.Replace zweimal ausführen)

Jede Idee, wie dieses Problem zu lösen?

Mit freundlichen Grüßen

+0

Auf https://www.dotnetperls.com/regex zeigen, wie Sie den regulären Ausdruck verwenden. Es ist sehr schnell zu lesen und sehr interessant !! – raBinn

+0

auch für schnelle Tests: https: //regex101.com/ –

Antwort

3

Es passiert, weil Übereinstimmungen nicht überlappen können. Sie haben

Other things\r\n 
End\r\n 
End\r\n 
Other things\r\n 

, die als

Other things***From Here***\r\n 
End\r\n***To Here*** 
End\r\n 
Other things 

Die Regex nicht die zweite \r\nEnd\r\n weil das Präfix \r\n abgestimmt ist bereits erfasst worden ist, mithalten können.

Versuchen:

temp = Regex.Replace(temp, @"(?<=\r\n)End(?=\r\n)+", "}"); 

die Nicht-Erfassung Mit (?<=) Gruppierung und (?=) Sie das Problem lösen kann (aber beachten Sie, dass nicht-Capturing ist, kann man nicht ersetzen kann, was in der (?<=) und (?=) abgestimmt ist, so der Unterschied in der ersetzten Text "}")