Memahami String.replaceAll() Anomali Penggantian Berganda
Timbul persoalan mengapa kod berikut:
<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
Salin selepas log masuk
menghasilkan "aa" bukannya "a" yang dijangkakan. Anomali ini juga berlaku apabila menggunakan ".*$".
Punca:
Anomali timbul daripada sifat regex ".*". Ia sepadan dengan mana-mana jujukan aksara, termasuk rentetan kosong. Oleh itu:
-
Perlawanan Pertama: “.*” sepadan dengan keseluruhan rentetan "ujian" dan menggantikannya dengan "a."
-
Perlawanan Kedua : “.*” juga boleh memadankan rentetan kosong, yang ditemui di hujung input. Padanan kedua ini menggantikan rentetan kosong dengan "a", menghasilkan penggantian berganda.
Penyelesaian:
Untuk mengelakkan isu ini, pertimbangkan untuk menggunakan:
-
.replaceFirst(): Hanya menggantikan kejadian pertama, menghalang penggantian berganda.
-
. : Memadankan mana-mana jujukan aksara satu atau lebih aksara, tidak termasuk rentetan kosong.
Gelagat Regex:
Sementara .* boleh memadankan rentetan kosong , ia tidak boleh sepadan lebih daripada dua kali. Ini kerana:
- Selepas perlawanan pertama, enjin regex mengalihkan satu aksara ke hadapan.
- Padanan kedua menggunakan .* untuk memadankan rentetan kosong yang kini berada di penghujung daripada input.
- Enjin regex menghabiskan input dan mengalihkan aksara lain ke hadapan.
- Tiada lagi input untuk .* untuk dipadankan, menghalang penggantian ketiga.
Atas ialah kandungan terperinci Mengapakah `String.replaceAll('.*', 'a')` menghasilkan 'aa' dan bukannya 'a'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!