Ich möchte einen String mit RegEx durchsuchen. Hier möchte ich z.B. beim String: "wecker 80%" ...den String "80" extrahieren. Dafür hätte ich nun diesen Code verwendet: .*([0-9]{1,3})%.* Die {1,3} verwende ich, da der Wert zw. 0 und 100 sein kann. Ich erhalte aber immer nur die letzte Zahl (die 0) zurück. Kann mir jemand sagen wie ich dem Regex mitteilen kann, dass ich den maximal möglichen String (die 80) erhalten möchte, und nicht den kleinsten (die 0)? Verwenden möchte ich den Code für Javascript.
Hans W. schrieb: > Kann mir jemand sagen wie ich dem Regex mitteilen kann, dass ich den > maximal möglichen String (die 80) erhalten möchte Normal sind regex immer greedy? Vielleicht mal am
1 | {1,3} |
herum drehen? mfg mf
Ich hatte das ganze auf dieser Seite hier getestet: https://regex101.com/ Nun habe ich das selbe auf einer anderen Seite probiert und da wird es mir so ausgegeben, wie ich es erwartet hätte: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_regexp Ich bekomme dort alse den maximalen String zurück. Wenn ich das ganze nun in meinen Code implementiere, wir mir ebenfalls der maximale String wiedergegeben. Warum auch immer, aber an der RexEx-Suche scheint es wohl nicht gelegen zu haben. Mein Problem ist nun aber weg :)
Hans W. schrieb: > Ich hatte das ganze auf dieser Seite hier getestet: > https://regex101.com/ Ist irgendwie recht merkwürdig. Ich würde auch sagen das es so wie von dir angegeben eigentlich funktionieren sollte. Probier mal folgende Varianten:
1 | .*[ ]([0-9]{1,3}).* |
2 | .*[ ]+([0-9]+)%.* |
3 | .*[ ]+([0-9]+).* |
4 | .*[ ]([0-9]+).* |
Hans W. schrieb: > Ich möchte einen String mit RegEx durchsuchen. Hier möchte ich z.B. beim > String: > "wecker 80%" > > ...den String "80" extrahieren. Dafür hätte ich nun diesen Code > verwendet: > .*([0-9]{1,3})%.* > > Die {1,3} verwende ich, da der Wert zw. 0 und 100 sein kann. Ich erhalte > aber immer nur die letzte Zahl (die 0) zurück. Greedy Matching mit ? ausschalten, sonst frißt Dein anfängliches .* alle Ziffern vor der letzten ({1,) vor dem % -- ".*? ([0-9]+)%" sollte gehen.
Ja, das mit dem ? hat funktioniert: .*?([0-9]{1,3})%.* Aber ehrlich gesagt verstehe ich nicht warum. Das ? will doch auch wieder ein Zeichen schlucken.
Hans W. schrieb: > Das ? will doch auch wieder ein Zeichen schlucken. Da verwechselst du was. In einer regex schluckt das ? nicht ein Zeichen. Es macht normalerweise das Element davor optional. Aber wenn es hinter einem Stern steht macht es den Stern non-greedy. Und die Gierigkeit des .* ist ja dein Problem. LG, Sebastian
:
Bearbeitet durch User
Achso, ok. Wieder etwas dazu gelernt. Danke für eure vielen Tipps :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.