Laden...

Regulärer Ausdruck für Zahlen (mit optionalen Nachkommastellen)

Erstellt von steschu vor 13 Jahren Letzter Beitrag vor 13 Jahren 7.000 Views
steschu Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren
Regulärer Ausdruck für Zahlen (mit optionalen Nachkommastellen)

Hallo,

Ich bastle mir gerade einen Parser, der die erste Zahl (Ganzzahl oder Kommazahl) aus einem Text extrahieren soll. Bsp.:

"3mm - 4mm" -> 3
"von 4 Uhr bis 5 Uhr" -> 4
"4,545kg und 6,4kg" -> 4.545

Dazu ersetze ich alle Zeichenketten, die nicht dem Muster 'Ziffer' oder 'ZifferKomma' entsprechen durch ein Leerzeichen.

Als entsprechende Regex dafür habe ich [^(\d+,?)] genommen. Funktioniert aber nicht.

Kennt sich jemand mit RegEx aus und kann mir helfen?

Danke,
Stephan

309 Beiträge seit 2008
vor 13 Jahren

Warum so kompliziert?

Nimm doch lieber Regex.Match mit einem Ausdruck der die Zahl direkt trifft:

Match zahl = Regex.Match(text, @"(\d+(,\d*)?)", RegexOptions.IgnoreCase);
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

steschu Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

Vielen Dank, funktioniert. Ich hab's leicht modifiziert, um auch negative Zahlen zu erwischen: @"-?\s+\d+(,\d+)?"

309 Beiträge seit 2008
vor 13 Jahren

Bitte, 😁

darf ich fragen für was das "\s+" in dem Ausdruck gut ist?

Damit wird der Ausdruck nur gefunden wenn vor der ersten Zahl (bzw. zwischen dem Vorzeichen und der ersten Zahl) ein Leerraumzeichen steht.
Bei deinen Beispielen aus dem ersten Posting werden beim 1. und 3. dann statt den ersten die zweiten Zahlen gefunden.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

steschu Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

darf ich fragen für was das "\s+" in dem Ausdruck gut ist?

Der Ausdruck ist schlecht, denn er muss natürlich wenn dann @"-?\s?\d+(,\d+)?" lauten, damit auch negative Zahlen erkannt werden, bei denen der Schreiber ein Leerzeichen zwischen Vorzeichen und Zahl geschrieben hat.

Aber um ehrlich zu sein, muss ich erst in der Praxis austesten, ob dieser Fall überhaupt vorkommt, denn mit dem möglichen Leerzeichen kann es auch zu ungewollten negativen Zahlen kommen, bei eingeschobenen Sätzen. Bsp.:

"Heute morgen - 5 oder 6 Uhr - ging die Sonne auf!"

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo steschu,

Herbivore hat ein Tool geschrieben mit dem man reguläre Ausdrücke gut testen kann.
Guckst du hier: On-the-fly Regex-Tester: Regex-Lab

Und hier noch ein Tutorial dazu: [Artikel] Regex-Tutorial

Grüsse