Forum: PC-Programmierung String mit RegEx durchsuchen


von Hans W. (hans_wurst)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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

von Hans W. (hans_wurst)


Lesenswert?

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 :)

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

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]+).*

von Norbert (der_norbert)


Lesenswert?

Entweder:
1
.* ([0-9]{1,3})%.*
oder:
1
[^0-9]*([0-9]{1,3})%.*

von Ein T. (ein_typ)


Lesenswert?

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.

von Hans W. (hans_wurst)


Lesenswert?

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.

von Sebastian W. (wangnick)


Lesenswert?

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
von Rolf M. (rmagnus)


Lesenswert?

Oder statt .* die Ziffern explizit ausschließen
[^0-9]*

von Hans W. (hans_wurst)


Lesenswert?

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
Noch kein Account? Hier anmelden.