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

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

Linda Hamilton
Linda Hamiltonasal
2024-10-31 09:28:29751semak imbas

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>

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:
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