Forum: PC-Programmierung C# .net4.5 Regular Expressions


von Be B. (bebo)


Lesenswert?

Hallo,

ich verzweifle gerade bei den Regular Expression.
1
String str = "abc hallo abc du abc ich xyz";
2
Match match = Regex.Match(str, "abc.*xyz");
3
=> abc hallo abc du abc ich xyz
4
5
String str = "abc hallo abc du abc ich xyz";
6
Match match = Regex.Match(str, "abc.*?xyz");
7
=> abc hallo abc du abc ich xyz

Sollte es nicht so sein, das .*? so wenig wie möglich Zeichen sucht? 
Aber bei mir kommt mit .* und .*? immer das gleiche heraus.

Hab ich da was falsch verstanden?

von D. I. (Gast)


Lesenswert?

Be Bo schrieb:
> Sollte es nicht so sein, das .*? so wenig wie möglich Zeichen sucht?

Wie kommst du da drauf?

von Be B. (bebo)


Lesenswert?

Siehe z.B. hier: http://msdn.microsoft.com/en-us/library/e347654k.aspx
Ist das gleiche Beispiel, nur mit einem .+?.


Bei meinem Beispiel würde ich erwarten, daß ich "abc ich xyz" 
zurückbekommen.

von adsf (Gast)


Lesenswert?

Standardmäßig sind Regex "greedy", d.h. sie finden den Term mit der 
maximalen Länge...

von Be B. (bebo)


Lesenswert?

Und wofür ist dann das Fragezeichen?

von Be B. (bebo)


Lesenswert?

Ich habe den Test noch einmal verändert:
1
String str = "xyz 1 abc hallo abc du abc ich xyz";
2
Match match = Regex.Match(str, "xyz.*?abc");
3
=> xyz 1 abc

In Vorwärtsrichtung kommt das raus, was ich erwarte.

Ich brauche aber einen RexEx der eine Marke am Ende findet und dann eine 
2. Marke möglichst kurz davor. Also das xyz am Ende ist die Referenz und 
dann das nächstgelegene abc davor.

von adsf (Gast)


Lesenswert?

ah, ok, sry, da bin ich von POSIX-regex ausgegangen. Hätte nochmal 
nachgucken sollen. Dann: keine Ahnung, versteh ich auch nicht.

von __tom (Gast)


Lesenswert?

Be Bo schrieb:
> Sollte es nicht so sein, das .*? so wenig wie möglich Zeichen sucht?
> Aber bei mir kommt mit .* und .*? immer das gleiche heraus.

bedenke dass regex immer von links nach rechts ausgeführt werden, dann 
passen beide operatoren, ob nun greedy oder lazy. was du möchtest heisst 
backtracking.

.+(abc.*xyz)

dürfte deinen wunsch erfüllen (im match in den gruppen schauen).

von Be B. (bebo)


Lesenswert?

A ha, danke.

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.