Reguläre Ausdrücke in Perl (7)

## Vorausschauende Suche

Seit der Perl Version 5 gibt es auch die Möglichkeit, bei der Suche nach einem Teilstring auf die nachfolgenden Zeichen vorauszuschauen und davon den Sucherfolg abhängig zu machen; etwa in der Art "Suche den Teilstring 'Regen', aber nur, wenn er nicht von 'wurm' gefolgt wird."

Dazu dienen die Klammerausdrücke "`(?=...)`" und "`(?!...)`" Wenn für das Muster vor einer dieser Klammern ein Teilstring gefunden wurde, wird überprüft, ob sich daran der Ausdruck in der Klammer anschließt; nur wenn dies der der Fall ist (bei "`(?=...)`") bzw. nicht zutrifft (bei "`(?!...)`") gilt die Suche als erfolgreich, sonst wird an einer anderen Stelle neu gesucht.

    #!/usr/local/bin/perl -w

    $t = "Regenwurm Regenschirm Regenschauer";

    if($t =~ /Regen(?!wurm)\w+/)  { print "true ($&)\n" }  # Test 1
                             else { print "false\n" }
    if($t =~ /Regen(?=scha)\w+/)  { print "true ($&)\n" }  # Test 2
                             else { print "false\n" }

Der erste Test sucht nach 'Regen', der aber nicht von 'wurm' gefolgt werden darf; daher ist die Suche erst bei 'Regenschirm' erfolgreich. Test 2 findet erst in 'Regenschauer' einen passenden Substring für 'Regen' gefolgt von 'scha'.

Hierbei ist unbedingt zu beachten, daß der Teilstring, der zu den Ausdrücken in einer der Klammern "`(?=...)`" oder "`(?!...)`" i.a. nicht in den Lösungsvariablen auftaucht; im obigen Beispiel werden die vollständigen Wörter nur deswegen ausgegebenen, weil 'schirm' und 'schauer' auf das Muster "`\w+`" passen.

Autor: Eike Grote | Letzte Änderung: 03.11.2004