Aus der offiziellen Java-Dokumentation http://docs.Oracle.com/javase/7/docs/api/java/util/regex/Pattern.html können wir sehen, dass reguläre Ausdrücke Quantoren darstellen. Es gibt drei Sätze von Symbole, nämlich gierig, zurückhaltend und besitzergreifend. Die Bedeutung ist wie folgt:
Der Unterschied zwischen Gierig, Zurückhaltend und Possessiv
Beispiele
Siehe die Tabelle oben , stellen wir fest, dass die Bedeutung der drei Quantoren gleich ist (zum Beispiel bedeuten X?, X?? und X? alle einmal oder nicht einmal), es gibt jedoch immer noch einige subtile Unterschiede zwischen ihnen. Schauen wir uns zunächst ein Beispiel an:
1.Gierig
public static void testGreedy() { Pattern p = Pattern.compile(".*foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
Ergebnis:
Übereinstimmung von 0 bis 13
2.Zögerlich
public static void testReluctant() { Pattern p = Pattern.compile(".*?foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
Ergebnis:
Übereinstimmung mit Form 0 bis 4
Übereinstimmung mit Form 4 bis 13
3.Possessiv
public static void testPossessive() { Pattern p = Pattern.compile(".*+foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
Ergebnis:
//Erfolgreich nicht abgeglichen
Grundsatzerklärung
Der Greedy-Quantifizierer wird „gierig“ genannt, da der Matcher beim ersten Versuch gezwungen ist, die gesamte Übereinstimmung zu lesen Eingabezeichenfolge, Wenn der erste Übereinstimmungsversuch fehlschlägt, gehen Sie Zeichen für Zeichen von hinten nach vorne zurück und versuchen Sie es erneut, bis die Übereinstimmung erfolgreich ist oder keine Zeichen mehr vorhanden sind, zu denen Sie zurückkehren können.
Musterzeichenfolge: .*foo
Suchzeichenfolge: xfooxxxxxxfoo
Ergebnis: Übereinstimmung von 0 bis 13
Der Vergleichsprozess ist wie folgt
Reluctant verwendet die entgegengesetzte Methode zu Greedy. Es beginnt an der ersten (Zeichen-)Position der Eingabezeichenfolge und liest nur widerstrebend ein Zeichen in einer passenden Suche, bis es versucht, das Ganze zu vervollständigen Zeichenfolge.
Musterzeichenfolge: .*foo
Suchzeichenfolge: xfooxxxxxxfoo
Ergebnis: übereinstimmende Form 0 bis 4
übereinstimmende Form 4 bis 13
Der Vergleichsprozess läuft wie folgt ab:
Possessive Quantifier liest immer die gesamte Eingabezeichenfolge und versucht einmal (und nur einmal), eine erfolgreiche Übereinstimmung herzustellen, Rollback erfolgt bei Possessive nie . Auch wenn dies der Fall ist, kann das Spiel insgesamt erfolgreich sein.
Musterzeichenfolge: .*foo
Suchzeichenfolge: xfooxxxxxxfoo
Ergebnis:
//Nicht übereinstimmend erfolgreich
Der Vergleichsprozess As folgt
Referenzartikel: http://docs.oracle.com/javase/tutorial/essential/regex/quant.html
Lassen Sie uns einen Blick darauf werfen noch ein paar Beispiele:
Musterzeichenfolge:
Musterzeichenfolge: . ?[0-9]
Suchzeichenfolge: abcd5aabb6
Ergebnis: passende Form 0 bis 4
Musterzeichenfolge:.{1,9} [0-9]
Suchzeichenfolge: abcd5aabb6
Ergebnis: Übereinstimmung von 0 bis 10
Musterzeichenfolge: .{1,10} [0-9]
Suchzeichenfolge: abcd5aabb6
Ergebnis: Übereinstimmung fehlgeschlagen