Rumah > Java > javaTutorial > teks badan

Mengapakah String.replaceAll(\'.*\', \'a\') menghasilkan \'aa\' dalam Java?

Barbara Streisand
Lepaskan: 2024-10-31 02:51:31
asal
877 orang telah melayarinya

Why does String.replaceAll(

Gelagat Padanan String.replaceAll(regex)

Pemerhatian ingin tahu bahawa String.replaceAll(".*", "a") terhasil dalam "aa" menimbulkan persoalan tentang sifat .* regex.

Memadankan Apa-apa

.* sepadan dengan mana-mana jujukan aksara, walaupun rentetan kosong. Oleh itu, padanan pertama merangkumi keseluruhan rentetan input, menggesa enjin regex untuk mencari padanan berikutnya bermula dari penghujung.

Walau bagaimanapun, .* juga boleh memadankan rentetan kosong pada penghujung input. Oleh itu, ia mencari padanan kedua dan menggantikannya dengan "a", yang membawa kepada keputusan "aa".

Menggunakan . dan .replaceFirst()

Untuk mengelakkan tingkah laku ini, gunakan . sebaliknya, kerana ia memerlukan sekurang-kurangnya satu aksara untuk dipadankan. Sebagai alternatif, gunakan .replaceFirst() untuk mengehadkan penggantian kepada kejadian pertama.

Penjelasan Tingkah Laku

Fakta bahawa .* sepadan dengan rentetan kosong adalah pelik dan patut diterokai lebih mendalam . Tidak seperti kebanyakan enjin regex, enjin regex Java mengalihkan satu aksara lebih jauh dalam input selepas padanan kedua dengan .*. Penyimpangan ini jelas dalam ilustrasi berikut:

<code class="text"># Before first run
regex: |.*
input: |whatever
# After first run
regex: .*|
input: whatever|
# Before second run
regex: |.*
input: whatever|
# After second run: since .* can match an empty string, it is satisfied...
regex: .*|
input: whatever|
# However, this means the regex engine matched an empty input.
# All regex engines, in this situation, will shift
# one character further in the input.
# So, before third run, the situation is:
regex: |.*
input: whatever<|ExhaustionOfInput>
# Nothing can ever match here: out</code>
Salin selepas log masuk

Walau bagaimanapun, perlu diperhatikan bahawa enjin regex lain seperti GNU sed menganggap input telah habis selepas perlawanan pertama.

Atas ialah kandungan terperinci Mengapakah String.replaceAll(\'.*\', \'a\') menghasilkan \'aa\' dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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