2016-09-01 1 views
4

ich folgendes alle Zahldaten haben:Regex für einzelne 0en zu suchen und hinzufügen Kommata

4245 4 0 0242 4424.09 0 422404 5955 0 
2234234.234 224 0 
2423 234 0 

Ich muss individuell jede Zeile verarbeiten. Ich brauche die alle einzelnen 0'en und Ausgabe zu entfernen, wie mit Komma folgt:

4245,4, 0242,4424.09, 422404,5955 
2234234.234,224 
2423,234 

ich bekam die Rolle, die einzelnen Ziffern des Entfernens arbeiten:

var result = Regex.Replace(inData, @"\b\s0\b", string.Empty); 

aber kann nicht herausfinden, wie die Kommas hinzufügen in zwischen jeder Nummer. Jede Hilfe wäre willkommen. Vielen Dank.

+1

Können Sie die Leerzeichen nicht einfach durch Kommas ersetzen, so: result.Replace ("", ",")? –

+0

Jede zwei Zahlen brauche ich auch einen zusätzlichen Platz. Ich dachte, es wäre mit Regex-Ausdruck möglich, aber vielleicht nicht. Zum Beispiel 1 2 0 5 6 0 sollte 1,2 5,6 –

Antwort

2

Sie erreichen, was Sie mit einem Regex.Replace Operation wollen, aber mit einem benutzerdefinierten Spiel Evaluator:

var input = "4245 4 0 242 4424.09 0 422404 5955 0"; 
var results = Regex.Replace(input, @"(?:\s+|^)0(\s+)|(\s+0)$|\s+", m => 
      m.Groups[1].Success ? ", " : 
      m.Groups[2].Success ? "" : ","); 

enter image description here

Die Ziel ist es, die Teile, die wir brauchen, in Gruppen zusammenzufassen, damit sie weiter analysiert werden können und entsprechende Maßnahmen ergriffen werden können.

Muster Details:

  • (?:\s+|^)0(\s+) - Spiel 0, die entweder am Anfang oder mit Leerzeichen, bevor es ist, und das mit 1 oder mehr Leerzeichen gefolgt wird (die Whitespaces nach 0 sind in der Gruppe gespeichert 1)
  • | - oder
  • (\s+0)$ - Gruppe 2 die Erfassung ein oder mehr Leerzeichen, dann ein 0 am Ende ($) der Zeichenfolge
  • | - oder
  • \s+ - (dritte Option) 1 oder mehrere Leerzeichen in allen anderen Zusammenhängen.

Und für den Fall mag man sich eine lesbare Version, hier ist eine Alternative, wo die endgültigen 0 mit String-Methoden entfernt wird, und dann 1 regex verwendet, um alle Räume innerhalb Ziffern mit einem Komma zu ersetzen, aber bevor wir ersetzen Sie alle 0 s durch eine String.Replace.

var inp = "4245 4 0 0242 4424.09 0 422404 5955 0"; 
inp = inp.EndsWith(" 0") ? inp.Substring(0, inp.Length - 2) : inp; 
var output = Regex.Replace(inp.Replace(" 0 ", ", "), @"(\d) (\d)", "$1,$2"); 
+1

Wow danke für die Antwort und Erklärung! Das funktioniert perfekt, Wiktor. –

+0

Wiktor, schnelle Frage. Was würde es brauchen, um auch -0 zu entfernen. Zum Beispiel würde "2423 234 -0 1 2 0" "2423,234 1,2" ausgeben. Danke. –

+0

Es ist einfach, fügen Sie einfach ein optionales '-':' @ "(?: \ S + | ^) -? 0 (\ s +) | (\ s + -? 0) $ | \ s +" ' –

0

Sie könnten einfach eine string.replace ("", ","), oder? (Wenn ich Ihre Frage richtig verstehe)

Oder Sie könnten sogar eine string.split ("") in ein Array tun, dann string.join (','). Obwohl dies wahrscheinlich weniger effizient ist.

+0

produzieren Jede zwei Zahlen brauche ich auch einen zusätzlichen Platz. Ich bin mir nicht sicher, ob das funktionieren würde. Ich dachte, es wäre mit Regex-Ausdruck möglich, aber vielleicht nicht. Zum Beispiel 1 2 0 5 6 0 sollte 1,2 5,6 –

+0

produzieren Sie könnten das mit dem Array tun, das aus dem Split erstellt wurde (solange Sie nicht mit extrem großen Zahlen arbeiten). Andernfalls könnten Sie die Implementierung verwenden, die vauhochzett erwähnt hat, und nach dem Muster für das ", d *", und ersetzen Sie das erste Komma durch Leerzeichen. – Ian656

1

Ich verstehe, dass Sie

wollen
  • ersetzen Räume mit Komma ("xy z" => "xy, z")
  • ersetzen einzelne Nullen mit Leerzeichen ("xy 0 z" => " xy, z ")

Dann würde ich zwei String-Ersatz empfehlen:

  1. inData.replace(" ", ",");,
  2. inData.replace(",0", " ");
1

diese Verwendung wird jedes Leerzeichen durch ein Komma ersetzen.

\s+ entspricht einem beliebigen Leerzeichen.

dann Ihre anderen regex ausführen, um die einstelligen zu entfernen 0'en

+0

Danke! Kann ich alles mit einem Regex machen? –

+0

Sorry zuerst habe ich nicht gesehen, dass die 0 nur entfernt und nicht in Kommas geändert wurden! Sie müssen entweder 2 regex Funktionen oder 2 string ersetzen Funktionen – DNKROZ

+0

Vielen Dank. Gibt es eine Möglichkeit, dies in einem Regex zu tun? Zum Beispiel 1 2 0 5 6 0 sollte produzieren 1,2 5,6 –