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
DDDasal
2024-12-21 05:51:10136semak imbas

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]

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

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]

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!

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