Was ist Greedy?

Mit regulären Ausdrücken und Platzhaltern beschreibt Greedy eine Art von Übereinstimmung, die auch nach einer gefundenen Übereinstimmung weiter nach einer Übereinstimmung sucht. Zum Beispiel passt der untenstehende Perl-Greedy-Regular-Ausdruck „.*e“ auf den gesamten Text bis zum letzten Buchstaben „e“ in der $example-Variablen. Dieses Beispiel gibt „Matched: Computer Hope“ zurück, nicht „Compute“, da der Text mehrere „e“-Zeichen enthält.

my $example = "Computer Hope";
$example =~ m/.*e/;
print "Matched: $&n";
Tipp

In Perl ist $& ein schneller Weg, um alles zu finden, was gefunden wurde.

Eine Methode, um den regulären Ausdruck nicht gierig zu machen (Lazy Matching), besteht darin, ein Fragezeichen (?) nach dem Sternchen hinzuzufügen

my $example = "Computer Hope";
$example =~ m/.*?e/;
print "Matched: $&n";
print "After: $'n";

, Wie nachfolgend dargestellt. Das Hinzufügen des Fragezeichens weist den Computer an, die Suche nach Übereinstimmungen zu beenden, sobald eine Übereinstimmung gefunden wurde.

Matched: Compute
After: r Hope
Das Ausführen des obigen Skripts gibt den folgenden Text zurück.

Tipp

In Perl ist $’ ein schneller Weg, um nach dem Match alles zu finden.

Das Fragezeichen kann anderen regulären Ausdruckstoken hinzugefügt werden, die ebenfalls gierig sind. Wenn Sie beispielsweise ein Pluszeichen (+) anstelle eines Sternchens verwenden, können Sie es in „+?“ ändern. in Ihrem regulären Ausdruck.

Warum sollten Sie kein gieriges Matching durchführen?

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<.*>//g;
print "Output: $htmln";

Ein Greedy-Match führt zu einer Menge zusätzlicher Arbeit, die normalerweise nicht erforderlich ist, wodurch das Abgleichen von Text viel langsamer wird. Wenn Sie beispielsweise eine HTML-Datei parsen und alle HTML-Tags entfernen möchten, verursacht der folgende gierige reguläre Ausdruck zusätzliche Arbeit und schlägt fehl.

Output: Test .

Aufgrund des gierigen Abgleichs passt der reguläre Ausdruck auf den Anfang des ersten Tags und dann auf alles bis zum Ende des letzten Tags. In unserem obigen Beispiel würde der folgende Text zurückgegeben, da alles zwischen dem ersten kleiner als (<) und dem letzten größer als (>) abgeglichen wird.

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<.*?>//g;
print "Output: $htmln";

Das Hinzufügen eines Fragezeichens nach dem Sternchen macht den regulären Ausdruck faul und zeigt eine bessere Ausgabe an.

Output: Test one two three.

Beim Lazy Matching wird Text bis zum ersten größer als abgeglichen, aber da /g (global) verwendet wird, wird es wiederholt, bis die Zeichenfolge kein HTML mehr enthält. Mit diesem regulären Ausdruck erhalten wir die folgende Ausgabe.

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<[^<>]+>//g;
print "Output: $htmln";

Lazy Matching hilft bei der Korrektur von Problemen mit dem Matching von zu viel Text und erhöht die Matching-Effizienz. Es könnte jedoch noch weiter verbessert werden, wenn das “.*” durch genau den Text ersetzt wird, der übereinstimmen oder nicht übereinstimmen soll. In unserem gleichen HTML-Beispiel könnten wir beispielsweise den folgenden regulären Ausdruck verwenden. [^<>]Im obigen Beispiel

+ in einem regulären Perl-Ausdruck besagt, dass es mit jedem Zeichen übereinstimmen soll, das kein Kleiner-als- oder Größer-als-Symbol ist. Dieser reguläre Ausdruck ist schneller und hilft auch dabei, fehlerhaften HTML-Code oder Text mit einem Kleiner-als- oder Größer-als-Symbol, das nicht mit dem Entitätsnamen oder der Nummer maskiert wurde, nicht abzugleichen.

Programmierbegriffe, Wildcard

Neueste Artikel
Vielleicht möchten Sie lesen

LEAVE A REPLY

Please enter your comment!
Please enter your name here