Frage zu reg exp

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/frage_zu_reg_exp_54924/page_1 - zur Vollversion wechseln!


jives schrieb am 12.11.2002 um 16:55

Was hat dieses Suchmuster für einen Sinn?
'#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is'

Also im Allgemeinen sucht das Trum nach beliebigem Text der zwischen {} steht und Leerzeichen und Punkte beinhalten kann, soweit ich das kapiert hab. Was mich aber verwirrt ist das '+?'.
'[a-z0-9]+' sucht zb nach beliebig vielen Buchstaben oder Zahlen. Nur was ändert sich bei '[a-z0-9]+?'? Sind das dann beliebig viele oder keine?

Und was machen '#' und '#is' am Anfang bzw. am Ende?


Ringding schrieb am 12.11.2002 um 21:13

+ heißt einmal oder öfter. Zur Vollständigkeit:

? einmal oder keinmal
* beliebig oft

# sind einfach die Begrenzer, so wie normalerweise /

Die Modifiers i und s musst nachschauen. i ist case insensitive, hätt ich gesagt, aber ich weiß jetzt nicht sicher. Schau nach und informier mich :)


jives schrieb am 12.11.2002 um 21:19

Ok, ich schau was ich finden kann :)
Dass + einmal oder öfter ist weiß ich, war auch nicht die Frage :)
Ich wollt wissen was dass ? in '+?' für einen Sinn hat.


Ringding schrieb am 12.11.2002 um 21:22

Ah sorry. Seh ich erst jetzt. Hmm, weiß ich auch nicht.


jives schrieb am 12.11.2002 um 21:38

Modifier:
i
Dies ist der wohl am meisten gebrauchte Modifier. Bei regulären Ausdrücken wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden - dieser Modifier schaltet dies aus.

s
Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt

m
Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt.

Quelle: http://www.devmag.net/webprog/regulaere_ausdruecke.htm

Was +? mach weiß ich immer noch nicht. Hab bis jetzt nur gefunden, dass es eignetlich nicht vorkommen darf :bash:

EDIT: Die Page da oben ist ganz nett :) Habs endlich gefunden:

Zitat
Standardmäßig versuchen die Quantifier, auf einen so großen Text wie möglich zu passen. Dies kann zu Problemen führen: Angenommen es liegt eine Zeichenkette $str = "[b_]text[/b_]text[b_]text[/b_]" vor, und wir möchten daraus "<b>text</b>text<b>text</b>" machen. Versuchen wir es folgendermaßen:

$str = preg_replace("!\[b\](.*)\[/b\]!","<b>text</b>",$str);

so erhalten wir als Ergebnis "<b>text[/b]text[b]text</b>" - nicht ganz das, was wir wollten. Um dieses Verhalten abzustellen, setzen wir hinter den Quantifier ein Fragezeichen "?":

$str = preg_replace("!\[b\](.*?)\[/b\]!","<b>text</b>",$str);

und das gewünschte Ergebnis ist erreicht!


Ringding schrieb am 12.11.2002 um 22:34

Aso, da gibt's auch einen globalen Modifier dafür, den Greediness Modifier.


M.I.P.S. schrieb am 17.11.2002 um 00:01

+? ließt man einfach von links nach rechts. + heißt, der Ausdruck kann 1 oder mehrere male vorkommen ? heißt der Ausdruck kann 1 mal oder gar nicht vorkommen.
Wenn man das kombiniert, heißt das, der []-Ausdruck kann man 1 oder mehrere male nehmen und diesen wiederum 0 oder 1 mal.

Somit ist +? äquivalent zu *. (Würd ich mal sagen)

Wenn du dir das ganze in Form von einem Syntxdiagramm ansiehst ist es eigentlich ganz logisch. :)


jives schrieb am 17.11.2002 um 12:03

Ja. As Ringding said, ein Greediness Modifier. Nur halt nicht global ;)
Ist allerdings != "*.", da "." für ein Zeichen steht, aber kein Quantifier ist - imho.


M.I.P.S. schrieb am 19.11.2002 um 19:23

Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend... :)


watchout schrieb am 19.11.2002 um 20:12

Zitat von M.I.P.S.
Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend... :)
dann musst du ihn aber escapen - sprich \.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025