Rumah > Java > javaTutorial > Mengapakah `String.replaceAll(\'.*\', \'a\')` menghasilkan \'aa\' dan bukannya \'a\'?

Mengapakah `String.replaceAll(\'.*\', \'a\')` menghasilkan \'aa\' dan bukannya \'a\'?

Linda Hamilton
Lepaskan: 2024-10-31 09:28:29
asal
813 orang telah melayarinya

Why does `String.replaceAll(

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan