str = 'id=xyz><d difopfwf9 <b>555</b> kewffoop ew43534 22.9877 fd<sdr ^ 4ffkp <p>reew 33p efjfi 189,4348 xx</b>2001<b>xx<html>r fei/jefw 8)( ewfd9e730ß 0,0044889 00.0044889 fdl 12.388.444,24 r4rßß 0 <b>44-55</b> rkfr0<tt>dfrfwrigp';
*Der String ist zum testen absichtlich so chaotisch
Das Ergebnis sollte liefern:
555
229877
warum nicht 22.9877
189.4348
du liest 189,4348 als 189.4348?
Ein . ist also kein Dezimalpunkt, sondern ?
Ein , wird als Dezimalpunkt interpretiert.
0.0044889
Wie obiges Beispiel
0.0044889
Inkonsistenz zu obigem
12388444.24
0
4455Ein Zahl soll richtig sein, wenn sie nicht direkt an ein anderes Zeichen angrenzt mit Ausnahme von typischen Trennern wie "," und "." und mit Ausnahme "innerhalb" Tag-Klammern. <b> 555</b> ist also ein Zahl. </b>333<b> wäre keine. <b>44-55</b> ist eine Zahl, dfdff 44-55 fdfd auch,
rtr44-55fdgfdg alerdings nicht. Auch sollte das Ergebnis in diesem Fall die Zahl ohne Trenner also 4455 zurückliefern. Oder aus 12.388.444,24 sollte 12388444.24 werden.
Ich versuche mich da jetzt schon seit 2 Tagen dran und habe leider auch kaum Ahnung von Regex. Meine Vorgehensweise erzeugt endlos lange Ausdrücke die immer abwechslend nach Buchstaben und Zahlen sucht aber so komme ich nicht weiter: id=xyz(\d+)(\D+)(\d+).*.....usw
Ist mein Vorhaben uberhaupt realistisch mit Regex zu lösen?
Das kommt darauf an, ob deine Daten sich an irgend eine kanonische Definition von "Zahl" halten.
Ein Geschmuddel wird nirgendwo hinführen.
Ein Ansatz besteht darin, dass man kanonische Teile definiert.
In Perl:
de und en bezeichnet die Komma/Tausender Schreibweise
my $integer_de = qr/\d+(?:'\d{3})*/;
# 1 12 123 1'234 12'345 123'456 1'234'567
my $signed_integer_de = qr/[+-]?$integer_de/;
# -1 12 123 +1'234 12'345 -123'456 +1'234'567
my $float_komma_de = qr /.(?:(?:\d{3}')+\d{1,2}|\d+)/;
# .1 .12 .123 .1234 .123'4 .123'456'78
my $signed_float_de = qr/
(?:
$signed_integer_de
$float_komma_de
|
$signed_integer_de
)/x;
# +0.1 -3.12 -12 123'456.589'01
usw...
mfg Beat