2016-04-09 10 views

Antwort

5

Es ist ein nicht-gierige Spiel. In [AB]*? sieht die Regex für so wenige Vorkommen von [AB] je nach Bedarf die gesamte Regex die gesuchte Zeichenkette machen übereinstimmen, während die gierige Version [AB]* für so viele Ereignisse wie möglich aussieht. Es ist eine Eigenschaft von Perls regexes und folglich verfügbar in PCRE (Perl-kompatible reguläre Ausdrücke) (sehen Sie repetition) und andere Systeme, die Perl für ihre Definition betrachten.

Die PCRE Seite gibt ein Beispiel:

Das klassische Beispiel, wo [greediness] Probleme gibt, ist bei dem Versuch, Kommentare in C-Programme anzupassen. Diese erscheinen zwischen /* und */ und innerhalb des Kommentars können individuelle * und / Zeichen erscheinen. Ein Versuch, C Kommentare entsprechen, indem das Muster Anwendung:

/\*.*\*/ 

auf den String

/* first comment */ not comment /* second comment */ 

versagt, weil sie die gesamte Zeichenfolge aufgrund der Gefräßigkeit des .* Artikel entspricht.

Wenn ein quantifier durch ein Fragezeichen folgt, hört es auf, gierig zu sein, und stattdessen entspricht die Mindestanzahl von Zeiten möglich, so dass das Muster

/\*.*?\*/ 

das Richtige tut mit den C-Kommentaren.

2

Jonathan hat bereits den Unterschied erklärt, aber hier ist ein Beispiel, das Ihnen helfen könnte zu verstehen, was hier passiert.

die Zeichenfolge "9AB" Gegeben:

  • ([0-9][AB]*?) Matches nur "9A", weil es so schnell wie "A" abgestimmt (faul) stoppen

  • ([0-9][AB]*) die gesamte Zeichenfolge entspricht ("9AB „), weil es verbraucht‚A‘und Erfolge die folgenden Ergebnisse‚B‘(gierig)

Beachten sie, dass der zweite eine Ziffer übereinstimmen, gefolgt von Null oder mehr (unbegrenzte) Anzahl von "A" oder "B" s.

+0

Danke für das Beispiel, Maroun. Ich habe dieses Beispiel in Python ausprobiert und anstatt zu bekommen, was Sie vorgeschlagen haben, bekomme ich ein Ergebnis von "9". Das war mein Code: x = re.search (r '[0-9] [AB] *?', '9AB') drucken x.group (0) – akaii

+0

Welches wäre das korrekte Ergebnis, "9 "oder" 9A "? – akaii

+2

9 ist korrekt, weil Null-Übereinstimmungen von '[AB]' erlaubt sind. Gierigkeit ist hauptsächlich wichtig, wenn etwas nach dem gierigen Quantifizierer ist. –