Ich muss Text wie "joe ($ 3,004.50)" auf 3004.50 filtern, aber ich bin schrecklich bei Regex und kann keine geeignete Lösung finden. Es sollten also nur Zahlen und Punkte bleiben - alles andere gefiltert. Ich verwende C # und VS.net 2008 Framework 3.5
92
joe.smith ($3,004.50)
? Das einfache Entfernen von beleidigenden Zeichenklassen kann völlig schief gehen.Regex.Replace(s, "[^$0-9.]", "");
Sie möchten das Dollarzeichen hinterlassen.Der reguläre Ausdruck ist:
Sie können den regulären Ausdruck zwischenspeichern:
dann benutze:
Beachten Sie jedoch, dass einige Kulturen unterschiedliche Konventionen für das Schreiben von Geldbeträgen haben, z. B.: 3.004,50.
quelle
.
hat keine besondere Bedeutung.Für die akzeptierte Antwort wirft MatthewGunn einen gültigen Punkt insofern auf, als alle Ziffern, Kommas und Punkte in der gesamten Zeichenfolge zusammengefasst werden. Dadurch wird Folgendes vermieden:
quelle
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)
auch "h25" in der Zeichenfolge "joe.smith25 ($ 3,004.50)"Der Ansatz, beleidigende Zeichen 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 keine Ziffern oder
joe.smith ($3,004.50)
Punkte entfernen, wird die Zeichenfolge in die nicht analysierbare Zeichenfolge umgewandelt.3004.50
.Imho, es ist besser, ein bestimmtes Muster abzugleichen und es mit einer Gruppe zu extrahieren. Etwas Einfaches wäre, alle zusammenhängenden Kommas, Ziffern und Punkte mit regulärem Ausdruck zu finden:
Beispieltestlauf:
Entfernen Sie dann für jede Übereinstimmung alle Kommas und senden Sie diese an den Parser. Um den Fall von so etwas zu behandeln
12.323.344
, können Sie eine weitere Überprüfung durchführen, um festzustellen, ob ein passender Teilstring höchstens einen hat.
.quelle
""
.Single.Parse()
oderSingle.TryParse
?Sie haben es mit einer Zeichenfolge zu tun - Zeichenfolge ist eine
IEumerable<char>
, sodass Sie LINQ verwenden können:quelle