Rumah  >  Artikel  >  Java  >  Mengapakah \"test\".replaceAll(\".\", \"a\") Menghasilkan \"aa\" dalam Java?

Mengapakah \"test\".replaceAll(\".\", \"a\") Menghasilkan \"aa\" dalam Java?

DDD
DDDasal
2024-11-01 06:07:31507semak imbas

Why Does

String ReplaceAll Anomali: Penggantian Berganda dengan ".*"

Di Java, kaedah String.replaceAll() menjalankan carian global dan menggantikan operasi pada rentetan yang diberikan menggunakan ungkapan biasa. Walau bagaimanapun, tingkah laku yang tidak dijangka timbul apabila menggunakan corak regex ".*", yang membawa kepada isu penggantian berganda.

Soalan itu menimbulkan senario di mana "test".replaceAll(".", "a ") menghasilkan "aa" sebagai hasilnya. Ini kerana . ialah pengkuantiti tamak yang sepadan dengan sebarang bilangan aksara (termasuk sifar), menangkap keseluruhan rentetan input pada mulanya. Akibatnya, penggantian pertama menggantikan keseluruhan rentetan dengan "a."

Walau bagaimanapun, . juga boleh memadankan rentetan kosong. Selepas penggantian awal, rentetan kosong yang tinggal di penghujung input layak sebagai padanan untuk . juga. Oleh itu, penggantian kedua berlaku, menggantikan rentetan kosong dengan "a", menghasilkan output akhir "aa."

Untuk mengelakkan isu penggantian berganda ini, pertimbangkan alternatif kepada .* seperti . , yang memerlukan sekurang-kurangnya satu aksara untuk dipadankan. Sebagai alternatif, menggunakan replaceFirst() hanya akan menggantikan kejadian pertama, mengelakkan situasi rentetan kosong dipadankan untuk kali kedua.

Menariknya, sesetengah enjin regex tidak mempamerkan gelagat penggantian berganda ini. Sebagai contoh, GNU sed akan menganggap input habis selepas perlawanan pertama, menghalang penggantian selanjutnya. Walau bagaimanapun, adalah penting untuk mengetahui potensi anomali ini apabila menggunakan ".*" dengan kaedah String.replaceAll() dalam Java.

Atas ialah kandungan terperinci Mengapakah \"test\".replaceAll(\".\", \"a\") Menghasilkan \"aa\" dalam Java?. 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