Rumah > Java > javaTutorial > Mengapakah String.replaceAll(regex) menggantikan dua kali apabila menggunakan \'.*\'?

Mengapakah String.replaceAll(regex) menggantikan dua kali apabila menggunakan \'.*\'?

Susan Sarandon
Lepaskan: 2024-10-31 16:03:46
asal
798 orang telah melayarinya

Why does String.replaceAll(regex) replace twice when using

Mengapa String.replaceAll(regex) Menggantikan Dua Kali

Dalam coretan kod:

System.out.println("test".replaceAll(".*", "a"));
Salin selepas log masuk

ungkapan biasa .* sepadan dengan mana-mana aksara, termasuk sifar aksara. Ini bermakna ia boleh memadankan keseluruhan rentetan dua kali:

  • Semasa hantaran pertama, .* memadankan keseluruhan rentetan dan menggantikannya dengan "a."
  • Semasa hantaran kedua, .* sepadan dengan rentetan kosong pada penghujung input (kerana ia boleh memadankan sifar aksara) dan menggantikannya dengan "a" lain.

Tingkah laku ini tidak dianggap sebagai pepijat dalam enjin regex Java . Sebaliknya, ia adalah akibat daripada cara .* sepadan dengan mana-mana watak.

Alternatif

Untuk mengelakkan tingkah laku ini, anda boleh menggunakan alternatif berikut:

  • Gunakan .replaceFirst() untuk menggantikan kejadian pertama sahaja:
"test".replaceFirst(".*", "a")
Salin selepas log masuk
  • Gunakan .matches() untuk menyemak sama ada keseluruhan rentetan sepadan dengan ungkapan biasa yang diberikan:
System.out.println("test".matches(".*")); // Prints true
Salin selepas log masuk
  • Gunakan ungkapan biasa yang lebih khusus, seperti . yang memerlukan sekurang-kurangnya satu aksara:
System.out.println("test".replaceAll(".+", "a")); // Prints a
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah String.replaceAll(regex) menggantikan dua kali apabila menggunakan \'.*\'?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan