2016-03-20 28 views
6

In der Dokumentation für die Pattern Klasse Java, ich sehe, dass die genaue quantifier X{n} beide gierig und nur ungern Formen hat:Unterschied zwischen genau gierig/widerwillig X {n}?

Greedy quantifiers

  • X {n} X, genau n-mal
  • ...

Reluctant quanti fiers

  • X {n}? X, genau n-mal
  • ...

Die Dokumentation enthält allgemeine Beispiele für den Unterschied zwischen gierigem und nur ungern Verhalten, aber nicht gibt keine Beispiele für die genauen quantifiers.

Zuerst dachte ich: "Nun, vielleicht ist der Unterschied, dass X selbst in unterschiedlichen Wegen übereinstimmen könnte." Aber dann X kann seine eigenen gierig/widerwillig Spezifizierer drin haben, und sicher genug, ich habe es getestet und das ist kein Unterschied (greedy vs reluctant).

Gegeben, dass es in jedem Fall genau n mal übereinstimmt, gibt es einen Unterschied zwischen dem Verhalten der beiden?

+0

'X {2}' = 'X {2}?'. Der erste ist kürzer - das ist der Unterschied. –

Antwort

5

Widerwillig vs gierig macht nur Sinn, wenn eine Anpassung mit variabler Länge möglich ist; Ein widerstrebender Quantifizierer wird dem minimal möglichen und gierigen Maximum entsprechen.

Um das Verhalten einer begrenzten Menge zu unterscheiden, muss es einen Bereich haben, dh die Menge muss ein unterschiedliches Minimum und Maximum haben. Zur Veranschaulichung:

Da der Eingang 1234567 nahmen die Gruppen sind:

(\d{2,3})(\d+) -> (123)(4567) 
(\d{2,3}?)(\d+) -> (12)(34567) 

Wenn es nur eine feste Größe ist, zum Beispiel \d{2} gibt es keinen Unterschied im Verhalten von einem ? hinzufügen.

+0

Das hört sich nach einer guten Antwort an, aber wissen Sie, welche Dokumentation das unterstützt? – Owen

+0

Das Fragezeichen bedeutet in allen Fällen * widerwillig *, dh "so wenig wie möglich von der vorhergehenden Menge, aber immer noch". In diesem Fall ist die kleinste Menge im Bereich von {2,3}, die immer noch eine Übereinstimmung erzeugen kann, "2". – Bohemian

Verwandte Themen