Problem mit Negative Lookbehind Assertion
Alex
- programmiertechnik
Hallo alle zusammen,
wieso erkennt der regukläre Ausdruck
/(?<!/zeugdazwischen)/zeugamende/
korrekterweise die Zeichenketten
"zeugamanfang/zeugamende"
"zeugamanfang/wasanderes/zeugamende"
während der Ausdruck
/zeugamanfang(?<!/zeugdazwischen)/zeugamende/
nur noch die erste Zeichenkette trifft (getestet mit preg_match in PHP 5)? Ich möchte doch einfach nur der negative lookbehind assertion etwas voranstellen. Wieso führt das zu einem Problem?
Gruß,
Alex
wieso erkennt der regukläre Ausdruck
/(?<!/zeugdazwischen)/zeugamende/
korrekterweise die Zeichenketten
"zeugamanfang/zeugamende"
"zeugamanfang/wasanderes/zeugamende"während der Ausdruck
/zeugamanfang(?<!/zeugdazwischen)/zeugamende/
nur noch die erste Zeichenkette trifft (getestet mit preg_match in PHP 5)? Ich möchte doch einfach nur der negative lookbehind assertion etwas voranstellen. Wieso führt das zu einem Problem?
Weil lookaheads/lookbehinds non consuming sind.
"zeugamanfang/wasanderes/zeugamende"
wäre zu mätschen mit
/wasanderes(?<!/zeugdazwischen)/zeugamende/
Das Pattern sagt:
unmittelbar vor "/zeugamende" MUSS "wasanderes" UND es darf nicht
"/zeugdazwischen" unmittelbar vor "/zeugamende" stehen.
mfg Beat
Weil lookaheads/lookbehinds non consuming sind.
"zeugamanfang/wasanderes/zeugamende"
wäre zu mätschen mit
/wasanderes(?<!/zeugdazwischen)/zeugamende/
Das Pattern sagt:
unmittelbar vor "/zeugamende" MUSS "wasanderes" UND es darf nicht
"/zeugdazwischen" unmittelbar vor "/zeugamende" stehen.
Hm, dann komme ich mit Lookbehind Assertions wohl auf keinen grünen Zweig. Ich möchte nämlich folgendes machen:
Getroffen werden sollen alle Ausdrücke, die mit "zeugamanfang" beginnen UND mit "/zeugamende" enden UND bei denen dem "/zeugamende" NICHT "/zeugdazwischen" vorausgeht. Escaping der Slashes habe ich der Lesbarkeit halber gerade mal weggelassen. ;-)
Kannst Du mir 'nen Tip geben?
Gruß,
Alex
Ich möchte nämlich folgendes machen:
Getroffen werden sollen alle Ausdrücke, die mit "zeugamanfang" beginnen UND mit "/zeugamende" enden UND bei denen dem "/zeugamende" NICHT "/zeugdazwischen" vorausgeht. Escaping der Slashes habe ich der Lesbarkeit halber gerade mal weggelassen. ;-)
Du hat bei dir vergessen, dass zwischen Anfang und Ende auch .*? vorkommen muss.
Kannst Du mir 'nen Tip geben?
Würge nicht alles in eine REX
Im Perl Stil
$pat =~ m#start(.*?)ende# and myfunc($1);
sub myfunc {
# parse den Inhalt
# gib das gewünschte zurück
}
mfg Beat
Ich möchte nämlich folgendes machen:
Getroffen werden sollen alle Ausdrücke, die mit "zeugamanfang" beginnen UND mit "/zeugamende" enden UND bei denen dem "/zeugamende" NICHT "/zeugdazwischen" vorausgeht. Escaping der Slashes habe ich der Lesbarkeit halber gerade mal weggelassen. ;-)Du hat bei dir vergessen, dass zwischen Anfang und Ende auch .*? vorkommen muss.
Du meinst, damit der Mittelteil konsumiert wird, da die Assertion das ja nicht tut?
Kannst Du mir 'nen Tip geben?
Würge nicht alles in eine REX
Hehe. Würde ich nicht probieren, wenn ich's nicht müßte. ;-) Da ich dem betreffenden Programm aber leider nur eine Regexp zum filtern geben kann, muß ich das irgendwie so hinbekommen. Selber Filterlogik als Programm zu ergänzen, ist nicht drin.
Gruß,
Alex