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!