RSS RegEx und die Gierigkeit

verfasst 06.08.2008 von MediaCix | kurze URL: /t368 | Kommentar schreiben

RegExp - Gierig oder nicht ?
Oft werde ich gefragt, was mit »Gier« bei regulären Ausdrücken eigentlich gemeint ist.
Die »Gier« bei regulären Ausdrücken wird somit begründet:
Reguläre Ausdrücke suchen immer die größtmöglichste Anzahl von Zeichen (gierig), die kann mit dem Modifer U unterdrückt werden.
Anhand von keinen Beispielen möchte ich darauf mal eingehen.

Nehmen wir an, wir suchen alle Buchstaben in einer Zeichenkette mit preg_match_all().

» PHP
<?php
$string 
'the quick brown fox jumps over the lazy dog';
?>


Benutzen wir dazu ein einfachen Ausdruck:

» PHP
<?php
// unser Ausdruck 
$ausdruck '([a-z])+'
$regexp '#'.$ausdruck.'#i';
?>


Zur Erklärung:

delimiter pattern (was wird gesucht) delimiter modifer
#         ([a-z])+                   #         i


([a-z])+ = Suche eine Gruppe von Zeichen, welche aus Buchstaben von a-z besteht, diese müssen einmal oder können beliebig oft vorkommen.

Im unseren kleinen Beispiel benutze ich den Modifer i, um die Groß- und Kleinschreibung ausser acht zu lassen.
Würden wir jetzt diese Beispiel anwenden, würden wir folgendes Array zurück erhalten:

[0] => Array
        (
            [0] => the
            [1] => quick
            [2] => brown
            ...
            [6] => the
            [7] => lazy
            [8] => dog
        )


Jetzt möchten wir uns die »gierigkeit« mal etwas näher betrachten, und erweitern unsern regulären Ausdruck um den Modifer U.

» PHP
<?php
// unser Ausdruck 
$ausdruck '([a-z])+'
$regexp '#'.$ausdruck.'#iU';
?>


Nach dem anwenden erhalten wir nun folgendes Array:

    [0] => Array
        (
            [0] => t
            [1] => h
            [2] => e
            ...
            [32] => d
            [33] => o
            [34] => g
        )


Was ist passiert ?

Mit dem Modifer U wurde nun die Gier unterdrückt, also nicht auf die größtmöglichste Anzahl von Zeichen suchen.
Da unser Quantor ein + ist, hat es nun zufolge, dass er jeden einzelnen Buchstaben erkennt.

Wir erinnern uns:
Quantor + = Das Zeichen muss einmal oder kann beliebig oft vorkommen.
Der Modifer U sagt jetzt praktisch dem Quantor "eh du, suche nur einmal, nicht alles" ...

Fazit:

Ich habe ein Korb mit 10 Äpfel.
Anstatt alle auf einmal zu nehmen (gierig), nehme ich nur ein einen aus dem Korb.
-> also »gierigkeit« unterdrückt

Ein interessanter Effekt mit Option \C noch zum Schluss.
Gierigkeit über mehrere Zeilen ohne Modifer s:

Ein Beispiel mit 2 Zeilen, wo das Wort ?Quick? mit Absicht 3 mal vorkommt.

The Quick 15 Brown Fox Jumped Over The Quick Dogs.
The Quick Brown Fox Jumped Over The Lazy 30 Dogs.


Wir wollen jetzt alles zwischen dem Wort ?Quick? mit Gier und ohne Gier suchen.
Suchen wir jetzt also alles mit Gier.

» PHP
<?php
preg_match
('#Quick(\C*)Quick#'$string$array);
?>


Ausgabe:

Array
(
    [0] => Quick 15 Brown Fox Jumped Over The Quick Dogs.
The Quick
    [1] =>  15 Brown Fox Jumped Over The Quick Dogs.
The 
)


Jetzt suchen wir nochmal, aber auf nicht Gierig.

» PHP
<?php
preg_match
('#Quick(\C*?)Quick#'$string$array);
?>


Ausgabe:

Array
(
    [0] => Quick 15 Brown Fox Jumped Over The Quick
    [1] =>  15 Brown Fox Jumped Over The 
)



(Änderungen vorbehalten)

neuen Kommentar schreiben

Ich möchte automatisch eine E-Mail bei neuen Kommentaren erhalten.



Themen mit ähnlichen Inhalten


Tags zum Beitrag

regex     gierig