Rumah >hujung hadapan web >tutorial js >Mengapa Bendera Global dalam RegExp Menghasilkan Keputusan Tidak Dijangka dengan Pelbagai Ujian?

Mengapa Bendera Global dalam RegExp Menghasilkan Keputusan Tidak Dijangka dengan Pelbagai Ujian?

Barbara Streisand
Barbara Streisandasal
2024-12-23 14:31:10521semak imbas

Why Does a Global Flag in RegExp Produce Unexpected Results with Multiple Tests?

Mengapa Bendera Global boleh Menghasilkan Keputusan RegExp Tidak Dijangka

Ungkapan biasa (RegExps) dengan bendera global (g) biasanya digunakan untuk mencari kemunculan berbilang corak dalam seutas tali. Walau bagaimanapun, menggunakan bendera ini bersama-sama dengan bendera tidak peka huruf besar-besaran (i) boleh membawa kepada hasil yang tidak dijangka.

Pertimbangkan contoh 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]

Dalam senario ini, kaedah ujian hanya kembali benar dalam lelaran pertama. Untuk memahami tingkah laku ini, kita perlu mempertimbangkan cara bendera g berfungsi.

Penjejakan Indeks Terakhir dengan Bendera g

Apabila digunakan dengan bendera g, objek RegExp menjejaki indeks terakhir tempat perlawanan berlaku. Pada perlawanan berikutnya, RegExp akan mula mencari dari indeks terakhir ini dan bukannya 0.

Menggambarkan konsep ini:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex); // Initial value is 0

console.log(re.test('Foo Bar')); // Matches at index 0
console.log(re.lastIndex); // Updated to 6

console.log(re.test('Foo Bar')); // No match, lastIndex is still 6
console.log(re.lastIndex); // Remains at 6

Dalam contoh ini, walaupun rentetan Foo Bar mengandungi padanan lain, panggilan ujian kedua mengembalikan palsu kerana RegExp telah mengalihkan kedudukan cariannya melepasi perlawanan.

Oleh itu, menggunakan bendera g bersempena dengan bendera i boleh mengakibatkan padanan terlepas jika rentetan carian mengandungi berbilang contoh corak dengan kes yang berbeza-beza. Untuk mengelakkan ini, pertimbangkan untuk menggunakan bendera i tanpa bendera g atau menggunakan satu panggilan ujian dengan bendera g untuk mencari padanan pertama sahaja.

Atas ialah kandungan terperinci Mengapa Bendera Global dalam RegExp Menghasilkan Keputusan Tidak Dijangka dengan Pelbagai Ujian?. 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