Regex - Lookbehind must be fixed

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Schokobussi

Grünschnabel
Hi zusammen,

ich knoble nun schon seit Stunden an einem Regex Problem das vermutlich ganz einfach zu lösen ist, aber der Knoten in meinem Kopf einfach nicht platzen will.
Die Aufgabe verlangt die Summenzeile zu finden und in dieser den letzten Zahlenwert auszugeben.
Ich suche in folgendem Beispieltext global nach der letzten Zahl in der jeweiligen Summenzeile. Im Beispiel Fett markiert zur Verdeutlichung.
Ich kann nur Regex Ausdrücke nutzen, da der Code als Einzeiler nachher von einem Parser weiterverwendet werden soll.

Mit:

(?<=SUMME \/ W;\d{1,3};;\d{1,3};\d{1,3};\d{1,3};)\d{1,3} -->der Smiley ist aus ; ) entstanden, also bitte als freundliches Missgeschick ignorieren/übersetzen.

hoffte ich das zu erreichen, aber dann mault er die Quantifier d/{1,3} an und das Lookbehind funktioniert nicht.

Seit so nett und helft mir.
.
.
.
02.03.;38;;;3;1;42;
03.03.;36;;;3;;39;
04.03.;51;;14;9;1;75;
05.03.;70;;9;9;;88;
06.03.;26;;;2;;28;
SUMME / W;221;;23;26;2;272;
09.03.;35;;10;6;1;52;
10.03.;50;;3;4;;57;
11.03.;48;;4;8;;60;
12.03.;35;;;4;1;40;
13.03.;15;;;3;;18;
SUMME / W;183;;17;25;2;227;
16.03.;23;;7;2;1;33;
17.03.;36;;1;3;;40;
18.03.;36;;;8;;44;
19.03.;34;;;2;;36;
20.+21.03.;22;;4;3;;29;
SUMME / W;151;;12;18;1;182;
23.03.;38;;4;4;1;47;
24.03.;26;;4;5;;35;
25.03.;24;;7;5;;36;
26.03.;22;;;3;;25;
27.+28.03.;4;;;2;;6;
SUMME / W;114;;15;19;1;149;
.
.
.
 
Wenn ich das teste, dann kommt da die Fehlermeldung
{1,3} A quantifier inside a lookbehind makes it non-fixed width

Lookbehind darf in der Länge nicht variabel sein.
Aber ich habe eine elegante Lösung gefunden. mit \K den Match zurücksetzen und nur das dahinter ausgeben.
Code:
^SUMME \/ W;\d{1,3};;\d{1,3};\d{1,3};\d{1,3};\K\d{1,3}

Test: Regex101 - online regex editor and debugger
Lösung: What's the technical reason for "lookbehind assertion MUST be fixed length" in regex?

\K Sets the given position in the regex as the new "start" of the match. This means that nothing preceding the K will be captured in the overall match.
Code:
/[\d]+\K[\d,]+/
123,456,789 -> 456,789
 
Grandios!
Wahrlich elegant und wie ich schon vermutet habe wirklich einfach; wenn man es dann weis ;P
Danke Dir für die super schnelle Lösung.
Damit hast einen Top Rang in meinem Nachtgebet heute.
 
Wäre auch zu schön gewesen um wahr zu sein.
Regex101 sagt die Lösung funktioniert. Macht ja auch Sinn.

Übertragen in den Parser von ioBroker gehe ich davon aus, das der Parser mit dem Negieren via /K nicht klar kommt. Nehme ich das /K/d+ am Schluss weg, zeigt er zumindest den String vorher an.. aber mit /K und ner Zahl als gesuchtem Wert... nada.

Noch ne Idee?
 
Zuletzt bearbeitet:
Meine Birne glüht jetzt schon. Das wird dann wirklich zu heftig zudem ich nicht mal weis ob der Parser das dann frisst.
Ich denke ich muss da anders ran. ggf. muss mein Auftraggeber in der Excel einfach ein Flag vor die Spalte setzen in der der Parser suchen muss und die Spalte optisch verstecken. Dann wird es für den verbuggten Parser einfacher. Du hast mir trotzdem sehr weitergeholfen und mir neues vermittelt. Vielen lieben Dank für Deine Mühe!

P.S: Fred umbenannt zur besseren Zuordnung, da ohne Parserproblem Lösungsträchtig ;)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück