Gieriger Modus:
Der Mengenzusammenhang standardmäßig für den Giermodus standardmäßig angezeigt. Die Ausdrücke von gierigen Mustern werden weiterhin übereinstimmen, bis sie nicht können. Wenn Sie feststellen, dass das Ergebnis der Ausdrucksübereinstimmung nicht mit dem erwarteten übereinstimmt, ist es sehr wahrscheinlich, dass es daran liegt, dass der Ausdruck nur mit den ersten Charakteren übereinstimmt, aber tatsächlich ein gieriges Muster ist, sodass es weiterhin mit übereinstimmt.
Gier und nicht gegründet, plus? ist nicht gegründet:
var s = '1023000'.match (/(/d+) (0*)/); '1023000'.Match (/^(/d+?) (0*) $/); s ["10", "1", "0"]
Java reguläre Ausdrücke verwenden standardmäßig das gierige gierige Matching -Muster. Es ist die längste Übereinstimmung dieses Typs (.*). Wenn die kürzeste Übereinstimmung erforderlich ist, wird es in (.*?) Das heißt, es ist ein kaum übereinstimmendes Muster.
Prinzipanalyse:
Wenn es sich um ein gieriges Matchungsmuster handelt, stimmt der reguläre Ausdrucksmotor bis zum Ende der Saite überein. Wenn das Match falsch ist, wird es rückwärts und finden die letzte Matching -Position, um das Matching -Ergebnis zurückzugeben. Wenn es sich um ein kaum übereinstimmendes Muster handelt, stimmt der reguläre Ausdrucksmotor mit dem Charakter am Ende des Musters überein und tritt dann einen Schritt zurück, stellt fest, dass das Match falsch ist, und verfolgen Sie dann die Position, in der das letzte im Fallback gefundene Spiel zutreffend ist und das Ergebnis zurückgibt.
Schauen Sie sich den Code an:
Beispiel 1:
public void test51 () {String str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.replaceall ("/"(.*)/" ","@"); System.out.println (str); } Ausgabe:
aaa "bb" cc "ddd" eeeaaa@eee
Beispiel 2:
@Test public void test52 () {String str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.replaceall ("/"(.*?/" ","@"); System.out.println (str); } Ausgabe:
aaa "bb" cc "ddd" eeeaaa@ccc@eee