836 Stimmen

Was bedeuten "lazy" und "greedy" im Zusammenhang mit regulären Ausdrücken?

Wie lauten diese beiden Begriffe auf verständliche Weise?

977voto

Sampson Punkte 258265

Gierige werden so viel wie möglich konsumieren. Von http://www.regular-expressions.info/repeat.html sehen wir das Beispiel des Versuchs, die HTML-Tags mit <.+> . Angenommen, Sie haben Folgendes:

<em>Hello World</em>

Sie denken vielleicht, dass <.+> ( . bedeutet ein beliebiges Zeichen, das kein Zeilenumbruch ist y + bedeutet eine oder mehrere ) würde nur mit dem <em> und die </em> wenn sie in Wirklichkeit sehr gierig sein wird und vom ersten < bis zum letzten > . Dies bedeutet, dass sie mit <em>Hello World</em> anstatt das, was Sie wollten.

Faulenzen ( <.+?> ) wird dies verhindern. Durch Hinzufügen der ? nach dem + sagen wir ihm, er soll wiederholen so wenige Male wie möglich so dass die erste > ist der Punkt, an dem wir den Abgleich stoppen wollen.

Ich möchte Sie ermutigen, Folgendes herunterzuladen RegExr ein großartiges Tool, das Ihnen hilft, reguläre Ausdrücke zu erforschen - ich verwende es ständig.

475voto

slebetman Punkte 100693

Gierig bedeutet, dass die längste mögliche Zeichenkette übereinstimmt.

Faule bedeutet, die kürzestmögliche Zeichenkette zu finden.

Zum Beispiel, die gierige h.+l passt zu 'hell' in 'hello' aber die Faule h.+?l passt zu 'hel' .

303voto

Premraj Punkte 65511

Gieriger Quantifizierer

Fauler Quantifizierer

Beschreibung

*

*?

Stern-Quantifizierer: 0 oder mehr

+

+?

Plus Quantifikator: 1 oder mehr

?

??

Optionaler Quantifizierer: 0 oder 1

{n}

{n}?

Quantifizierer: genau n

{n,}

{n,}?

Quantifizierer: n oder mehr

{n,m}

{n,m}?

Quantifizierer: zwischen n und m

Fügen Sie einem Quantifizierer ein ? hinzu, um ihn ungereedet, d. h. faul zu machen.

Beispiel:
Prüfzeichenfolge : Stackoverflow
gieriger Registrierungsausdruck : s.*o Ausgabe: Stackoverflo w
Ausdruck "träge : s.*?o Ausgabe: Stacko verflow

79voto

Carl Norum Punkte 210051

Gierig bedeutet, dass Ihr Ausdruck auf eine möglichst große Gruppe passt, faul bedeutet, dass er auf die kleinstmögliche Gruppe passt. Für diese Zeichenfolge:

abcdefghijklmc

und diesen Ausdruck:

a.*c

Ein "gieriger" Treffer entspricht der gesamten Zeichenkette, während ein "fauler" Treffer nur die erste abc .

29voto

Eugene Punkte 9467

Soweit ich weiß, sind die meisten Regex-Engines standardmäßig gierig. Fügen Sie ein Fragezeichen am Ende des Quantifizierers hinzu, um eine faule Übereinstimmung zu ermöglichen.

Wie @Andre S in einem Kommentar erwähnte.

  • Gierig: Suchen Sie so lange, bis die Bedingung nicht erfüllt ist.
  • Faul: Beendet die Suche, sobald die Bedingung erfüllt ist.

Was gierig und was faul ist, können Sie dem folgenden Beispiel entnehmen.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String args[]){
        String money = "100000000999";
        String greedyRegex = "100(0*)";
        Pattern pattern = Pattern.compile(greedyRegex);
        Matcher matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm greedy and I want " + matcher.group() + " dollars. This is the most I can get.");
        }

        String lazyRegex = "100(0*?)";
        pattern = Pattern.compile(lazyRegex);
        matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm too lazy to get so much money, only " + matcher.group() + " dollars is enough for me");
        }
    }
}

Das Ergebnis ist: ``` Ich bin gierig und ich will 100000000 Dollar. Das ist das meiste, was ich bekommen kann.

Ich bin zu faul, um so viel Geld zu besorgen, nur 100 Dollar reichen mir.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X