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

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

Barbara Streisand
Lepaskan: 2024-10-31 02:51:31
asal
950 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!

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