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
Patricia Arquetteasal
2024-12-21 12:26:10762semak imbas

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

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

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!

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