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

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

Susan Sarandon
Susan Sarandonasal
2024-10-31 16:03:46603semak imbas

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"));

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")
  • Gunakan .matches() untuk menyemak sama ada keseluruhan rentetan sepadan dengan ungkapan biasa yang diberikan:
System.out.println("test".matches(".*")); // Prints true
  • Gunakan ungkapan biasa yang lebih khusus, seperti . yang memerlukan sekurang-kurangnya satu aksara:
System.out.println("test".replaceAll(".+", "a")); // Prints a

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