Rumah > hujung hadapan web > tutorial js > Mengapakah `RegExp` dengan Bendera Global dan Case-Insensitive Mengembalikan Keputusan yang Tidak Dijangka?

Mengapakah `RegExp` dengan Bendera Global dan Case-Insensitive Mengembalikan Keputusan yang Tidak Dijangka?

DDD
Lepaskan: 2024-12-21 05:51:10
asal
135 orang telah melayarinya

Why Does `RegExp` with Global and Case-Insensitive Flags Return Unexpected Results?

Kekeliruan RegExp Global

Bendera global (g) dalam ungkapan biasa direka bentuk untuk mencari semua kemunculan corak dalam rentetan , berbanding dengan yang pertama sahaja. Walau bagaimanapun, apabila digunakan dengan bendera tidak sensitif huruf besar-besaran (i), ia mungkin tidak memberikan hasil yang diharapkan.

Masalahnya

Pertimbangkan senario berikut:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
Salin selepas log masuk

Sebabnya

Masalah timbul kerana bendera global menyebabkan objek RegExp menjejaki indeks terakhir tempat perlawanan berlaku. Dalam perlawanan seterusnya, carian bermula daripada indeks ini dan bukannya 0. Inilah yang berlaku dalam contoh di atas:

console.log(re.lastIndex);  // 0

console.log(re.test('Foo Bar'));  // true
console.log(re.lastIndex);  // 6

console.log(re.test('Foo Bar'));  // false
console.log(re.lastIndex);  // 6
Salin selepas log masuk

Seperti yang anda lihat, padanan kedua menghasilkan "palsu" kerana carian bermula dari indeks 6, di mana perlawanan telah berlaku semasa ujian pertama.

Menyelesaikan Isu

Untuk mengelakkan isu ini, anda boleh menetapkan semula sifat lastIndex objek RegExp antara padanan:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
re.lastIndex = 0;  // Reset the last index
result.push(re.test('Foo Bar'));
// result will be [true, true]
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah `RegExp` dengan Bendera Global dan Case-Insensitive 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan