Frage zur Negierung in regulären Ausdrücken
binne99
- perl
Hallo!
Ich würde gern prüfen das auf eine Zeichenkette, NICHT eine andere Zeichekette folgt.
Beispiel:
Es soll geprüft werden, dass auf "auto" nicht "haus" folgt.
"automarke" oder "autofahrer" wäre aber ok.
Dächte, das geht so /^auto[^haus].*/
Da es nicht ging, schaute ich mal, woran das liegt. Ahhh, [^haus] bedeutet, dass nur EIN Zeichen aus dieser Klasse nicht nach "auto" folgen darf.
Hab dann erkannt, dass ich das so hätte schreiben müssen:
/^auto[^h][^a][^u][^s].*/
Dann klappt das. Die Frage aber ist: kann man das nicht kürzer fassen? Oder muss man zwingend jeden Buchstaben eines Wortes extra klammern und negieren?
Und wie macht man dass dann, wenn man bspw. "haus" und "center" AUSSCHLIESSEN wöllte?
Vielen Dank,
Binne
Ich würde gern prüfen das auf eine Zeichenkette, NICHT eine andere Zeichekette folgt.
[...]
Hab dann erkannt, dass ich das so hätte schreiben müssen:
/^auto[^h][^a][^u][^s].*/Dann klappt das. Die Frage aber ist: kann man das nicht kürzer fassen?
Ja, z.B. mit einem negative lookahead
/^auto(?!haus)/
Und wie macht man dass dann, wenn man bspw. "haus" und "center" AUSSCHLIESSEN wöllte?
/^auto(?!haus|center)/
danke, danke, danke.
das ging aber fix.
Ok, mit dem "Lookahead" schau ich mir an.
Damit hab ich einen guten Ansatz, wonach ich suchen muss.
Danke,
Binne
du brauchst negative lookaheads mit der Syntax /ver(?=!boten\b)/
mfg Beat
Korrektur
Syntax ist /ver(?!boten\b)/
mfg Beat
Hi,
Beispiel:
Es soll geprüft werden, dass auf "auto" nicht "haus" folgt.
"automarke" oder "autofahrer" wäre aber ok.Dächte, das geht so /^auto[^haus].*/
Da es nicht ging, schaute ich mal, woran das liegt. Ahhh, [^haus] bedeutet, dass nur EIN Zeichen aus dieser Klasse nicht nach "auto" folgen darf.Hab dann erkannt, dass ich das so hätte schreiben müssen:
/^auto[^h][^a][^u][^s].*/
Dann hast Du falsch erkannt.
Probier es mal mit automarke aus (was laut Deiner Aussage ja ok wäre).
Die ersten 4 Zeichen 'auto' passen.
Das m ist kein h, paßt.
Das a ist aber ein a, ist also nicht erlaubt.
Uuuuups.
Was Du brauchst, ist ein negative Lookahead.
Dann klappt das.
genau, wenn Du einen negativen Lookahead für das 'haus' benutzt, dann klappt das.
Die Frage aber ist: kann man das nicht kürzer fassen?
Du willst einen kürzeren Ausdruck, der Deinen Anforderungen nicht genügt? Kannst Du haben: /./
Oder muss man zwingend jeden Buchstaben eines Wortes extra klammern und negieren?
Nein, darf man nicht, weil das den Anforderungen nicht genügt.
Man kann einen negativen Lookahead benutzen.
(ich will nicht ausschließen, daß es andere Lösungen gibt ...)
Und wie macht man dass dann, wenn man bspw. "haus" und "center" AUSSCHLIESSEN wöllte?
Indem man im negativen Lookahead eine Alternative benutzt.
cu,
Andreas
Hi,
Hab dann erkannt, dass ich das so hätte schreiben müssen:
/^auto[^h][^a][^u][^s].*/Dann hast Du falsch erkannt.
Probier es mal mit automarke aus (was laut Deiner Aussage ja ok wäre).
oder mit "autor", wenn danach nichts mehr (bzw. wenig genug) kommt. "auto" ist da, dann kommt ein "r", also kein "h". Soweit, so gut. Nun wird aber ein Zeichen verlangt, das kein "a" ist - fehlt, kein Match.
Cheatah
Hi,
Dann hast Du falsch erkannt.
Probier es mal mit automarke aus (was laut Deiner Aussage ja ok wäre).
oder mit "autor", wenn danach nichts mehr (bzw. wenig genug) kommt. "auto" ist da, dann kommt ein "r", also kein "h". Soweit, so gut. Nun wird aber ein Zeichen verlangt, das kein "a" ist - fehlt, kein Match.
Hätte ich jetzt ALLE Fälle aufführen müssen, in denen es zu einem falschen Ergebnis kommt?
Ich dachte, zum Beweis, daß etwas nicht richtig ist, reicht ein einziges Gegenbeispiel.
Und da hab ich extra eins gewählt, daß von binne99 angeführt wurde.
cu,
Andreas
Hi,
Hätte ich jetzt ALLE Fälle aufführen müssen, in denen es zu einem falschen Ergebnis kommt?
nö, es gibt schließlich hier im Forum noch genug andere, die den Rest übernehmen können. Einer davon war in diesem Fall ich, und ich bin gespannt, wer der nächste ist.
Ich dachte, zum Beweis, daß etwas nicht richtig ist, reicht ein einziges Gegenbeispiel.
Klar doch. Zum Lernen und Verstehen helfen mehr.
Cheatah
Hallo Cheatah!
Hi,
Hätte ich jetzt ALLE Fälle aufführen müssen, in denen es zu einem falschen Ergebnis kommt?
nö, es gibt schließlich hier im Forum noch genug andere, die den Rest übernehmen können. Einer davon war in diesem Fall ich, und ich bin gespannt, wer der nächste ist.
Ich: autoDIDAKT
Da ist zwar ein A drin, aber kein a - und da kein ignore case-Flag dranhängt ;)
Aaaaaargh, Zeit für die autoSLEEP-Funktion!
;)
Viele Grüße aus Frankfurt/Main,
Patrick