Rumah > hujung hadapan web > tutorial js > Mengapa Kaedah `test()` Global Regexp Mengembalikan Keputusan Yang Tidak Dijangka?

Mengapa Kaedah `test()` Global Regexp Mengembalikan Keputusan Yang Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-12-21 12:26:10
asal
770 orang telah melayarinya

Why Does a Global Regexp's `test()` Method Return Unexpected Results?

Hasil Salah daripada Regexp dengan Bendera Global

Dalam kod yang disediakan, ungkapan biasa RegExp(pertanyaan, 'gi') digunakan dengan kedua-dua bendera g (global) dan i (tidak sensitif huruf besar-besaran). Walau bagaimanapun, hasilnya tidak dijangka: [true, false].

Memahami Bendera Global

Bendera g dalam objek RegExp mengawal kelakuan ujian() kaedah. Apabila ditetapkan, test() mencari corak dalam rentetan berulang kali, bermula dari tempat perlawanan sebelumnya berakhir. Ini dikenali sebagai "kelekatan."

Penjelasan Keputusan Salah

Dalam contoh, panggilan pertama untuk re.test('Foo Bar') mencari padanan " Foo B." Memandangkan bendera g ditetapkan, lastIndex dikemas kini kepada kedudukan selepas "Foo B." Ini bermakna panggilan seterusnya untuk re.test('Foo Bar') mula mencari dari kedudukan selepas "Foo B." Tiada padanan ditemui, membawa kepada keputusan palsu.

Contoh dengan Sticky Flag

Pertimbangkan kod berikut:

var reg = /^a$/g;
for(i = 0; i++ < 10;)
   console.log(reg.test("a"));
Salin selepas log masuk

Kod ini dicetak "benar" 10 kali. Memandangkan reg mempunyai bendera g, ia melekat pada perlawanan terakhir, berulang kali menguji "a" dari kedudukan selepas perlawanan sebelumnya sehingga tamat rentetan.

Penyelesaian

Untuk membetulkan kod asal, tetapkan semula re.lastIndex kepada 0 sebelum setiap panggilan ujian():

var query = 'Foo B';
var re = new RegExp(query, 'gi');
result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
Salin selepas log masuk

Ini memastikan carian bermula dari permulaan rentetan untuk setiap panggilan test(), menghasilkan hasil yang betul bagi [true, true].

Atas ialah kandungan terperinci Mengapa Kaedah `test()` Global Regexp Mengembalikan Keputusan Yang Tidak Dijangka?. 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