WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   frage zu regular expressions (http://www.wcm.at/forum/showthread.php?t=182274)

RaistlinMajere 04.01.2006 11:56

frage zu regular expressions
 
Code:

"/\/app\/(.*?)(\/.*|)$/"
folgendes ist mir dabei nicht ganz klar:

1.) warum wird der ausdruck (.*?) in eine klammer geschrieben? normalerweise bedeutet das ja, daß das ergebnis in einem zwischenspeicher landet, auf den man danach wieder zugreifen kann. in meinem fall findet ein solcher zugriff allerdings nicht statt, wozu also das hier?

2.) der ausdruck (.*?) sucht ja nach 0 bis n beliebigen Zeichen und zwar nicht greedy. welchen sinn hat dann aber das fragezeichen, wenn die suchergebnisse sowieso aus 0 bis n beliebigen zeichen bestehen? bricht die suche da nicht schon nach dem 1. zeichen ab? wenn ja, wäre ein (.{0,1}) da nicht besser?

3.) eine pipe kenne ich als OR, nur was bedeutet die pipe in (\/.*|)?

vielen dank im voraus.

jak 06.01.2006 18:11

Meine Ideen (k.A. ob sie stimmen):
ad 1.) Ich schätz da gehts nur darum es zu gruppieren (das ist der eigentliche Zweck der (), das der Inhalt für später gespeichert wird ist "nur" ein goodie).
ad 2.) Ich glaube .* ist schon greedy, das Fragezeichen dient IMHO dazu das am Ende etwas übrig bleibt ("abcdefg" sollte auf /a(.*?)g/ aber nicht auf /a(.*)g/ matchen - da das .* bcdefg matcht und nichts "übrig" lässt).
ad 3.) k.A. ich kann keinen Unterschied zu (\/.*) erkennen.
Wie gesagt das ist nur das was ich mir denke, muß nicht stimmen.

T.dot 06.01.2006 23:42

ich bin wirklich kein regex profi und vermute zu 3. nur:

vielleicht muss entweder .* folgen oder es folgt nichts mehr

mfg Thomas

jak 07.01.2006 11:41

Das denke ich auch, aber:
.* matcht sowieso 0 bis n, daher ist das "|nichts" überflüssig.

jak

Flink 07.01.2006 13:16

Re: frage zu regular expressions
 
Zitat:

Original geschrieben von RaistlinMajere
Code:

(\/.*|)$

Bedeutet dann, daß er entweder '/' mit beliebigen folgenden Zeichen oder nichts vor einem Zeilenende sucht. D.h. 'nichts' müßte er in allen Leerzeilen finden. Ansonsten würden Leerzeilen nicht angezeigt werden.

RaistlinMajere 12.01.2006 15:44

Zitat:

Original geschrieben von jak
ad 2.) Ich glaube .* ist schon greedy, das Fragezeichen dient IMHO dazu das am Ende etwas übrig bleibt ("abcdefg" sollte auf /a(.*?)g/ aber nicht auf /a(.*)g/ matchen - da das .* bcdefg matcht und nichts "übrig" lässt).
so wie ich das sehe, matcht /a(.*)g/ aber sehr wohl auch mit "abcdefg", sowie z.b. auch mit "aXXXg". sofern ist mir nicht ganz klar, was du mit dem "uebrigen" meinst. dient das fragezeichen zur abgrenzung? ich habe gegoogelt und in dem zusammenhang (.*?) habe ich rausgefunden, dass damit "nicht greedy" gesucht wird.

jak 12.01.2006 20:34

Ich bin auch nur Laie was Regexp betrifft, mein Beispiel war schlecht gewählt. Ein besseres findest du hier:
http://de.wikipedia.org/w/index.php?...iges_Verhalten
Zitat:

Angenommen es wird auf den String "ABCDEB" der reguläre Ausdruck A.*B angewendet, so würde er den kompletten String "ABCDEB" matchen. Mit Hilfe des "non-greedy"-Quantors "*?" matcht der Ausdruck A.*?B die Zeichenkette "AB", bricht also die Suche nach dem ersten gefundenen "B" ab.
jak

RaistlinMajere 12.01.2006 23:15

@jak: danke, aber das war mir eh klar, beschreibt ja nicht mehr als eine "nicht greedy"-suche. ;)

ich denke ich hab jetzt auch verstanden, was damit in dem ursprünglichen regExp-ausdruck gemeint war.

statt "A" im beispiel habe ich halt hier "/app/", ansonsten verhält sich das ganze genauso und ich war nur durch die (wie mir nun klar ist eigentlich unnötige) klammernsetzung etwas verwirrt. richtig?

jak 13.01.2006 17:37

Ja, seh' ich genauso.

jak


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

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