WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   RexExp Newbie-Frage (http://www.wcm.at/forum/showthread.php?t=233939)

RaistlinMajere 20.03.2009 13:51

RexExp Newbie-Frage
 
Bevor ich jetzt noch lange rumsitze und grüble, frage ich lieber hier die Experten:

Code:

my $t = "xxxxAzz";

if($t =~ /x{2}/) {
  print "$& enthalten\n";
}
else {
  print "$& nicht enthalten\n";
}

Wieso wird hier die Bedingung erfüllt, wenn der reguläre Ausdruck doch besagt "suche genau 2 x hintereinander" und nicht "suche mindestens 2 x hintereinander" (das wäre ja {2,})?

RaistlinMajere 23.03.2009 11:08

anyone...?

Yoghurt 24.03.2009 23:49

Hi,

Code:

x{2}
trifft natürlich die 2 xx in deinem Text weil ja keine Einschränkung gegeben wurde was darauf folgen darf.

Code:

(?<!x)x{2}(?!x)
...sollte so Matchen wie du das willst (nehm ich an). Heißt soviel wie: vor 2 x'en darf kein x stehen und nachher auch nicht. Damit matched es nur wenn 2 x'en kommen und dannach ein anderer Buchstabe. Das würde bei deinem Beispiel mit dem String "xxxxAzz" kein Match bedeuten, bei z.B. "xxsxxAzz" aber schon.

RaistlinMajere 25.03.2009 10:15

Zitat:

Zitat von Yoghurt (Beitrag 2353366)
Hi,

Code:

x{2}
trifft natürlich die 2 xx in deinem Text weil ja keine Einschränkung gegeben wurde was darauf folgen darf.

das habe ich mir auch gedacht, aber das würde bedeuten daß es keinen unterschied zwischen x{2} und x{2,} gibt, welche in der literatur aber sehr wohl unterschiedlich behandelt werden. :confused:

Yoghurt 25.03.2009 12:10

Der Unterschied ist, das ein Ausdruck auch mehrmals matchen kann innerhalb eines Suchstrings. Und dann ergibt x{2} schon was anderes als x{2,}

x{2} (genau 2 Vorkommen von x)

xxxxxxx -> 3 Matches (xxxxxxx, xxxxxxx, xxxxxxx)

x{2,} (mindestens 2 Vorkommen von x)

xxxxxxx -> 1 Match (xxxxxxx)

Aber stimmt schon... wenn du nur auf Success abfragst (if) dann ist in dem Fall beides true.

Kann dir den RegExCoach empfehlen... da kannst du die Expressions einfach ausprobieren und er zeigt dir auch warum er was getroffen hat...
http://www.weitz.de/regex-coach/

RaistlinMajere 25.03.2009 12:43

Zitat:

Zitat von Yoghurt (Beitrag 2353409)
Der Unterschied ist, das ein Ausdruck auch mehrmals matchen kann innerhalb eines Suchstrings. Und dann ergibt x{2} schon was anderes als x{2,}

x{2} (genau 2 Vorkommen von x)

xxxxxxx -> 3 Matches (xxxxxxx, xxxxxxx, xxxxxxx)

so weit war ich auch schon, nur das bedeutet ja dann, daß hier greedy gesucht wird, obwohl das nicht explizit angegeben wurde.
oder ist das bei diesem ausdruck immer der fall (so wie bei * und +)?

Yoghurt 25.03.2009 12:51

Das Regex default Verhalten ist immer greedy. Willst du es lazy musst du es explizit mit z.B. ? angeben.

RaistlinMajere 25.03.2009 13:00

Zitat:

Zitat von Yoghurt (Beitrag 2353419)
Das Regex default Verhalten ist immer greedy. Willst du es lazy musst du es explizit mit z.B. ? angeben.

ok, nur wozu gibts dann die /g-option, wenn das eh default ist?
oder wird die nur beim ersetzen gebraucht, weil dort der default lazy ist?

Yoghurt 25.03.2009 14:41

Jo, soweit ich weiß wird beim Replace mit der Option /g angegeben das alle Matches ersetzt werden. Ohne dieser Option wird nur das erste Vorkommen ersetzt...

Bei Replace String 'xxxxAzz' mit 's'

x{2} ohne /g -> 'sxxAzz'
x{2} mit /g -> 'ssAzz'

RaistlinMajere 25.03.2009 14:45

alles klar, danke!


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag