Beat: Regex: Alle Zahlen aus String filtern

Beitrag lesen

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
4455

Ein 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

--
Woran ich arbeite:
X-Torah
><o(((°>      ><o(((°>
   <°)))o><                      ><o(((°>o