2017-10-17 1 views
2

Text aus txt-Datei:Regex, wenn die Bedingung C#

10 25 
32 44 
56 88 
102 127 
135 145 
... 

Wenn es sich um eine erste Zeile Platz 0, Rest die letzte Nummer als erste in neue Zeile verwenden. Ist es möglich, dies zu tun, oder muss ich nach dem Regex-Parsing die Zeilen durchlaufen.

0 10 25 
25 32 44 
44 56 88 
88 102 127 
127 135 145 

(?<Middle>\d+)\s(?<End>\d+) //(?<Start>...) 
+1

Auch wenn es möglich ist, warum wollen Sie Regex dafür verwenden, würde das nicht mit einer fast unlesbaren Funktion enden? – Dale

+1

Regex ist das letzte Werkzeug, das ich dafür verwenden würde. – Amy

+1

@Amy, ich würde Regex nach der Verwendung meiner letzten verfügbaren Werkzeug ... – taquion

Antwort

1

Beachten Sie, dass ein Regex-Ansatz für eine Aufgabe wie diese nicht ganz gut klingt. Es kann für kleine Eingabe-Strings verwendet werden, für größere wird empfohlen, dass Sie mehr Logik schreiben und Text Zeile für Zeile analysieren.

also mehr von akademischem Interesse, hier ist eine Regex-Lösung zeigt, wie mit unterschiedlichen Ersatzmustern auf der Grundlage zu ersetzen, ob die Leitung angepasst ist erstes oder nicht:

var pat = @"(?m)(?:(\A)|^(?!\A))(.*\b\s+(\d+)\r?\n)"; 
var s = "10 25\n32 44\n56 88\n102 127\n135 14510 25\n32 44\n56 88\n102 127\n135 145"; 
var res = Regex.Replace(s, pat, m => m.Groups[1].Success ? 
     $"0 {m.Groups[2].Value}{m.Groups[3].Value} " : $"{m.Groups[2].Value}{m.Groups[3].Value} "); 

Ergebnis der C# demo:

0 10 25 
25 32 44 
44 56 88 
88 102 127 
127 135 14510 25 
25 32 44 
44 56 88 
88 102 127 
127 135 145 

Beachten Sie die \n Zeilenumbrüche sind hart codiert, aber es ist immer noch nur eine Illustration der Regex-Funktionen.

Muster Details

  • (?m) - ein Inline-RegexOptions.Multiline Modifikator
  • (?:(\A)|^(?!\A)) - eine Nicht-Erfassung Gruppenanpassung entweder
    • (\A) - Beginn der Zeichenkette, die es zu Gruppen Erfassung 1
    • | - oder
    • ^(?!\A) - Anfang einer Zeile (aber nicht Zeichenfolge aufgrund der (?!\A) negativen Vorschau)
  • (.*\b\s+(\d+)\r?\n) - Gruppe 2:
    • .*\b - 0+ Zeichen außer Newline zur letzten Wortgrenze bis auf eine Linie, gefolgt mit ...
    • \s+ - 1+ Leerzeichen
    • (\d+) (mit [\p{Zs}\t]+ nur übereinstimmen horizontal Leerzeichen ersetzt werden) - Gruppe 3: ein oder mehr Dig seine
    • \r?\n - eine CRLF oder LF Leitungsunterbrechung.

Der Ersatz Logik ist im Inneren des Spiel Auswerter: Gruppe 1, wenn angepaßt (m.Groups[1].Success ?) ersetzen mit 0 und Gruppe 2 Gruppe 3 + Werte + Raum. Else, ersetzen durch Gruppe 2 + Gruppe 3 + Leerzeichen.

2

würde ich raten, gegen die Verwendung von Regex aus Gründen der Lesbarkeit, aber dies funktioniert:

var input = ReadFromFile(); 
var regex = @"(?<num>\d*)[\n\r]+"; 
var replace = "${num}\n${num} "; 
var output = Regex.Replace(input, regex, replace); 

, dass alles von den ersten 0.

Verwandte Themen