Apabila bekerja dengan ungkapan biasa (RegEx), adalah penting untuk memahami kesan pelbagai bendera pada gelagat padanan. Satu isu yang membingungkan timbul apabila menggunakan bendera global (g) dan tidak sensitif huruf besar (i) bersama-sama.
Masalahnya:
Pertimbangkan kod 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'));
Keputusan Jangkaan: [benar, benar]
Keputusan Sebenar: [true, false]
Penjelasan:
Bendera g dalam objek RegEx membolehkan penerusan padanan daripada indeks yang terakhir ditemui. Ini bermakna selepas perlawanan pertama ditemui, ujian seterusnya akan meneruskan pencarian daripada watak serta-merta selepas perlawanan sebelumnya. Tingkah laku ini boleh membawa kepada hasil yang tidak dijangka apabila corak melibatkan berbilang kejadian subrentetan yang sama.
Dalam contoh kami, padanan awal berlaku pada aksara pertama 'Foo Bar'. Walau bagaimanapun, ujian kedua (tanpa bendera g) memulakan semula proses pemadanan dari permulaan rentetan, menghasilkan keputusan palsu walaupun perlawanan yang dijangkakan pada contoh 'Foo' seterusnya.
Menyelesaikan Isu:
Untuk mengurangkan isu ini, pertimbangkan untuk menggunakan sifat lastIndex objek RegEx untuk mengawal indeks permulaan secara manual bagi setiap ujian, seperti yang dilihat dalam contoh berikut:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); console.log(re.lastIndex); console.log(re.test('Foo Bar')); console.log(re.lastIndex); re.lastIndex = 0; console.log(re.test('Foo Bar')); console.log(re.lastIndex);
Pendekatan ini membolehkan tingkah laku padanan yang lebih boleh diramal, memastikan corak dinilai terhadap keseluruhan rentetan setiap kali.
Atas ialah kandungan terperinci Mengapa Menggabungkan Bendera `g` dan `i` dalam RegExp JavaScript Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!