Lassen Sie uns zunächst die Verwendungen der drei zusammenfassen:
・ Ersetzen (Charsequence -Ziel, charsequence -Ersatz) , Ersetzen Sie alle Ziele durch Ersatz, beide Parameter sind Zeichenfolgen.
・ Austausch (String Regex, Zeichenfolgeersatz) , alle Regex -Übereinstimmungen durch Austausch ersetzen. Regex ist offensichtlich ein regulärer Ausdruck, Ersatz ist eine Zeichenfolge.
・ ErsatzFirst (String Regex, String -Ersatz) , der im Grunde genommen mit Ersatzstich entspricht. Der Unterschied besteht darin, dass nur die erste Übereinstimmung ersetzt wird.
Als nächstes gibt es eine einfache Anforderung, die eine in der Quellzeichenfolge durch /a ersetzen soll. Der Code lautet wie folgt:
System.out.println ("Abac" .Replace ("a", "// a")); ///ab/acsystem.out.println("abac".replaceall("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); // AbacDas Ergebnis war eine große Überraschung. Nach so vielen Jahren des Ersatzes war ich ein wenig verwirrt.
Die Quellzeichenfolge ist "ABAC", und dann finden wir "a", ersetzen Sie sie durch /a. Da /ein Java Escape -Charakter ist, müssen Sie, wenn Sie ausdrücken möchten, "// a" schreiben, der erste Backslash entgeht dem zweiten Backslash in eine normale Zeichenfolge.
Bei drei Ersatzausdrücken ist nur das Ergebnis der ersten Ersatzfunktion korrekt. Was ist das Problem?
Ersetzen und Ersatz sind erforderlich, dass der erste Parameter ein regelmäßiger Ausdruck ist. "A" kann sowohl als Zeichenfolge A als auch als regulärer Ausdruck A verstanden werden, sodass der erste Parameter in Ordnung ist.
Das Problem liegt im zweiten Parameter. Wenn die Leser die Kommentare der Ersatz -Funktion sorgfältig lesen, finden sie die folgende Erklärung:
Beachten Sie, dass Backslashes (/) und Dollarsschilder ($) in der Ersatzzeichenfolge dazu führen können, dass die Ergebnisse anders sind als wenn sie als wörtliche Ersatzzeichenfolge behandelt wurden. Siehe Matcher.Replaceall. Verwenden Sie java.util.regex.matcher.quoterePlacement, um die besondere Bedeutung dieser Zeichen zu unterdrücken, falls gewünscht.
Da der erste Parameter von Ersatz und Ersatz regelmäßig ist, können wir im zweiten Parameter einige kleine Tricks erstellen, z. B. eine Anforderung: Ersetzen Sie eine in der Quellzeichenfolge durch das Zeichen unmittelbar nach A, der Code ist wie folgt:
System.out.println ("Abac" .ReplaceAll ("a (// w)", "$ 1 $ 1"); //bbccsystem.out.println("abac".replacefirst("a(//w) "," $ 1 $ 1 ")); // BBACAngenommen, die Bedeutung der Regelmäßigkeit kann vom Leser verstanden werden, ist ersichtlich, dass im zweiten Parameter das $ -Symbol verwendet werden kann, um den Inhalt der Gruppe zu erhalten. In diesem Beispiel wird 1 US -Dollar verwendet, um den Inhalt der ersten Gruppe zu erhalten, dh dem Charakter unmittelbar nach a.
Daher hat das $ -Symbol im zweiten Parameter eine besondere Bedeutung, und es wird zufällig ein Fehler verursacht:
System.out.println ("Abac" .ReplaceAll ("a (// w)", "$"); // Ausnahme im Thread "Haupt" java.lang.stringIndexoutofBoundSexception: String -Index außerhalb des Bereichs: 1Was ist, wenn ich es nur durch $ ersetzen möchte? Dies erfordert entkommene Charaktere:
System.out.println ("Abac" .ReplaceAll ("a", "// $")); // $ b $ cZu diesem Zeitpunkt können die Leser plötzlich erkennen, dass der Backslash im zweiten Parameter auch eine besondere Bedeutung (entkommen) hat. Wenn wir also den Backslash ausdrücken wollen, müssen wir ihm erneut entkommen:
System.out.println ("abac" .replaceall ("a", "," /// a ")); ///ab/acsystem.out.println("abac".replacefirst("a "," ///// a ")); /// AbacUm kurz zu verstehen, entgeht der vordere Backslash in "//// a" danach aus dem Backslash, so dass der Backslash danach eine normale Zeichenfolge ist. Auf diese Weise lautet die in Java -Speicher zu sehene Zeichenfolge "// a". Bei der Verarbeitung verwendet die Ersatz -Funktion den vorderen Backslash, um danach aus dem Backslash zu entkommen, um auszudrücken, dass der Backslash danach eine gewöhnliche Zeichenfolge ist, die nicht zur Flucht $ verwendet wird, und die endgültige Zeichenfolge im Speicher ist " /a", sodass A erfolgreich durch /a ersetzt werden kann.
Zusammenfassen
Das Problem der Flucht ist in der Tat verwickelt. In diesem Artikel hofft der Autor, dass die Leser in Zukunft wach bleiben können, wenn sie diese Funktionen verwenden, sich der Sonderzeichen in den Parametern bewusst sind und nicht Zeitbomben schreiben können. Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Studium und die Arbeit aller hilfreich sein. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.