2017-07-07 9 views
0

Ich probiere Dienste in C# aus, daher kann ich Werte mit Console.WriteLine (...) nicht debuggen. Deshalb weiß ich nicht, was in meiner variablen Zahl am Ende ist:C# Regex.Split() funktioniert nicht wie erwartet

public int addAndSoustractNumberFromAString(string ustr) 
    { 
     int result = 0; 

     if(!string.IsNullOrEmpty(str)) 
     { 
      string str = ustr.Trim(); 

      //Regexes 
      System.Text.RegularExpressions.Regex valid_regex = new System.Text.RegularExpressions.Regex(@"[\+]\d+|[\-]\d+"); 
      System.Text.RegularExpressions.Regex invalid_regex = new System.Text.RegularExpressions.Regex(@"[a-zA-Z]"); 

      //Handling errors 
      if (invalid_regex.IsMatch(str) || !valid_regex.IsMatch(str) || !Char.IsDigit(str[str.Length - 1])) return 0; 
      if (Char.IsDigit(str[0])) str = "+" + str; 

      //Load all numbers in a string array 
      List<string> numbers = new List<string>(valid_regex.Split(str).ToArray()); 

      //Cast string numbers to int + result calculation 
      foreach (string number in numbers) { if (!int.TryParse(number, out int n)) return 99; result += n; } 
     } 

     return result; 
    } 

Was meinen Code tut? Ich gebe Ergänzungen & Subtraktionen, es macht die Operationen & das Ergebnis als Ganzzahl zurück.

Beispiel: Wenn ich eingeben "52-2 + 3" sollte es 53

Problem zurück: Mein Code gibt immer 99 Wich bedeutet das Parsing fehlgeschlagen. Nur für den Fall, versuchte ich int.TryParse("-2", out int n) statt und es funktioniert gut.

Die Leitung nicht funktioniert:

List<string> numbers = new List<string>(valid_regex.Split(str).ToArray());

Mein Regexes ist in Ordnung, ich testete sie mit der Website regexstorm net.

Meine Frage ist, warum meine Zeichenfolge nicht richtig unter Verwendung einer angenommenen gültigen Regex aufgeteilt wird? Regex.Split() nicht tun, was ich glaube, dass es tut? (Ich dachte, es würde meine Zeichenfolge in + Nummer oder -number Strings teilen

Randnotiz: Es ist in Ordnung, wenn nicht mit einem Zeichen beginnen. Wenn meine Zeichenfolge mit einer Nummer beginnt, wird am Ende für + "+" hinzufügen regex Zwecke.

+0

Warum deklarieren Sie einen int innerhalb des Aufrufs von 'TryParse'? Willst du diesen Wert nicht bekommen? Haben Sie versucht, 'int n;' dann 'int.TryParse (number, out n)' zu deklarieren? – Rafalon

+0

Ja, es funktioniert für meine anderen Methoden. Nur für den Fall, dass ich getestet habe und es immer noch 99 anzeigt. Es ist in Ordnung, es in der Funktion TryParse zu deklarieren. –

+0

Konnten Sie diesen Code nicht in eine Konsolenanwendung importieren und dort debuggen? –

Antwort

1

Ihre Regex ist kein Split() ing Regex.

Split() erwartet den regulären Ausdruck das Trennzeichen (zB Split auf ein Komma oder Semikolon). Ihre regex beschreibt die Werte zu definieren.

Es scheint, als ob Sie das Ergebnis von Matches() und nicht von Split() möchten.

Dies scheint für mich mit Ihrem Beispiel zu arbeiten:

List<string> numbers = valid_regex.Matches(str).Cast<Match>().Select(m => m.Value).ToList(); 

Auch LinqPad ein wunderbares Werkzeug ist Code-Schnipsel wie diese zum Prototyp.

+0

Es funktioniert! Wie erwartet, habe ich die Funktion regex.split() falsch verstanden. Vielen Dank ! –

0

Ersetzen Sie Ihre Regexp mit ([\+\-]\d+) machte den Trick mit dem Beispiel "52-2+3"here.

Auch nach der Trennung .Where(x => !String.IsNullOrEmpty(x)).ToList(); hinzugefügt, so dass Sie leeren Strings loswerden.

Verwandte Themen