it-swarm.com.de

Entfernen Sie alle (nicht numerisch) OR Zeitraum)

Ich brauche einen Text wie "joe (3.004.50 $)", um auf 3004.50 gefiltert zu werden, bin aber bei Regex schrecklich und kann keine geeignete Lösung finden. Es sollten also nur Zahlen und Punkte bleiben - alles andere wird gefiltert. Ich verwende C # und VS.net 2008 Framework 3.5

75
Ready Cent

Das sollte es tun:

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
146
josephj1989

Die Regex ist:

[^0-9.]

Sie können den Regex zwischenspeichern:

Regex not_num_period = new Regex("[^0-9.]")

dann benutze:

string result = not_num_period.Replace("joe ($3,004.50)", "");

Sie sollten jedoch bedenken, dass einige Kulturen unterschiedliche Konventionen für das Schreiben von Geldbeträgen haben, beispielsweise: 3.004,50.

30

Für die akzeptierte Antwort erhebt MatthewGunn einen gültigen Punkt, indem alle Ziffern, Kommas und Punkte in der gesamten Zeichenfolge zusammengefasst werden. Dies wird das vermeiden:

string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
  v = m.Groups[1].Value;
  v = Regex.Replace(v, ",", "");
}
2
mindriot

Sie haben es mit einem String zu tun - String ist ein IEumerable<char>, also können Sie LINQ verwenden

var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));

Console.WriteLine(result);   // 3004.50
1
w.b

Der Ansatz, beleidigende Charaktere zu entfernen, ist möglicherweise problematisch. Was ist, wenn irgendwo ein anderer . in der Zeichenfolge ist? Es wird nicht entfernt, obwohl es sollte!

Wenn Sie Nicht-Ziffern oder Punkte entfernen, würde sich die Zeichenfolge joe.smith ($3,004.50) in den nicht-analysierbaren .3004.50 umwandeln.

Imho, es ist besser, ein bestimmtes Muster abzugleichen und es mit einer Gruppe zu extrahieren. Etwas einfach wäre es, alle zusammenhängenden Kommas, Ziffern und Punkte mit regexp zu finden:

[\d,\.]+

Beispieltestlauf:

Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
>  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"

Entfernen Sie dann für jedes Spiel alle Kommas und senden Sie diese an den Parser. Um mit 12.323.344 umzugehen, könnten Sie noch einmal prüfen, ob ein übereinstimmender Teilstring höchstens einen . enthält.

0
Matthew Gunn