Pertama, mari kita ringkas penggunaan mereka bertiga:
・ Ganti (target charsequence, penggantian charsequence) , ganti semua target dengan penggantian, kedua parameter adalah string.
・ ReplaceAll (string regex, penggantian string) , ganti semua pencocokan regex dengan penggantian. Regex jelas merupakan ekspresi reguler, penggantian adalah string.
・ REPLACEFIRST (string regex, penggantian string) , yang pada dasarnya sama dengan replaceall, perbedaannya adalah bahwa hanya pertandingan pertama yang diganti.
Selanjutnya, ada persyaratan sederhana, yaitu untuk menggantikan A dalam string sumber dengan /a, kodenya adalah sebagai berikut:
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 ")); // abacHasilnya adalah kejutan besar. Setelah bertahun -tahun penggantian, saya sedikit bingung.
String sumber adalah "abac", dan kemudian kita menemukan "a", menggantinya dengan /a. Karena /adalah karakter Java Escape, jika Anda ingin mengekspresikan /A, Anda harus menulis "// a", backslash pertama lolos dari backslash kedua menjadi string normal.
Dengan tiga ekspresi penggantian, hanya hasil fungsi ganti pertama yang benar. Apa masalahnya?
Replaceall dan Replacefirst mensyaratkan bahwa parameter pertama adalah ekspresi reguler. "A" dapat dipahami sebagai string A dan ekspresi reguler A, jadi parameter pertama baik -baik saja.
Masalahnya terletak pada parameter kedua. Jika pembaca dengan cermat membaca komentar dari fungsi Replaceall, mereka akan menemukan penjelasan berikut:
Perhatikan bahwa backslash (/) dan tanda dolar ($) dalam string pengganti dapat menyebabkan hasilnya berbeda dari jika diperlakukan sebagai string penggantian literal; Lihat Matcher.Replaceall. Gunakan java.util.regex.matcher.quotereplacement untuk menekan makna khusus dari karakter -karakter ini, jika diinginkan.
Karena parameter pertama dari Replaceall dan Replacefirst secara teratur, kita dapat membuat beberapa trik kecil di parameter kedua, seperti persyaratan: ganti A dalam string sumber dengan karakter segera mengikuti A, kode adalah sebagai berikut:
System.out.println ("Abac" .replaceall ("a (// w)", "$ 1 $ 1"))); //bbccsystem.out.println("abac".replacefirst("a(//w) "," $ 1 $ 1 ")); // BBACAsumsikan bahwa makna keteraturan dapat dipahami oleh pembaca, dapat dilihat bahwa dalam parameter kedua, simbol $ dapat digunakan untuk mendapatkan konten grup. Dalam contoh ini, $ 1 digunakan untuk mendapatkan konten grup pertama, yaitu karakter segera mengikuti a.
Oleh karena itu, simbol $ memiliki makna khusus dalam parameter kedua, dan menulisnya secara acak akan menyebabkan kesalahan:
System.out.println ("Abac" .replaceall ("a (// w)", "$")); // Pengecualian di Thread "Main" Java.lang.StringIndExoutOfBoundsException: Indeks String di luar kisaran: 1Bagaimana jika saya hanya ingin menggantinya dengan $? Ini membutuhkan karakter yang melarikan diri:
System.out.println ("Abac" .replaceall ("a", "// $")); // $ b $ cPada titik ini, pembaca dapat tiba -tiba menyadari bahwa backslash juga memiliki makna khusus (melarikan diri) di parameter kedua, jadi jika kita ingin mengekspresikan backslash, kita harus melarikan diri lagi:
System.out.println ("abac" .replaceall ("a", "//// a")); ///ab/acsystem.out.println("abac".replacefirst("a "," //// a ")); /// AbacUntuk memahami secara singkat, backslash depan di "//// a" lolos dari backslash sesudahnya, sehingga backslash setelah itu adalah string normal. Dengan cara ini, string yang terlihat dalam memori java adalah "// a". Saat memproses, fungsi ReplaceAll menggunakan backslash depan untuk keluar dari backslash setelah itu untuk mengungkapkan bahwa backslash setelah itu adalah string biasa, tidak digunakan untuk melarikan diri $, dan string terakhir dalam memori adalah " /a", sehingga A dapat berhasil diganti dengan /A.
Meringkaskan
Masalah pelarian memang terjerat. Melalui artikel ini, penulis berharap bahwa pembaca akan dapat tetap terjaga saat menggunakan fungsi -fungsi ini di masa depan, menyadari karakter khusus dalam parameter, dan menghindari bom waktu menulis. Di atas adalah seluruh konten artikel ini. Saya berharap ini akan membantu untuk belajar dan bekerja semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.