Mengapakah ungkapan biasa untuk bendera global menyebabkan output yang salah?
P粉282627613
P粉282627613 2023-08-22 19:11:39
0
2
511
<p>Apakah yang salah dengan regex ini apabila saya menggunakan bendera global dan bendera tidak sensitif huruf besar-besaran? Pertanyaan ialah input yang dijana pengguna. Hasilnya sepatutnya [benar, benar]. </p> <pre class="brush:php;toolbar:false;">var query = 'Foo B'; var re = new RegExp(query, 'gi'); var hasil = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); //Hasilnya ialah [true, false]</pre> <hr> <p> <pre class="snippet-code-js lang-js prettyprint-override"><code>var reg = /^a$/g; untuk(i = 0; i++ < 10;) console.log(reg.test("a"));</code></pre> </p>
P粉282627613
P粉282627613

membalas semua(2)
P粉399090746

Anda menggunakan objek RegExp dan melaksanakannya beberapa kali. Pada setiap pelaksanaan, ia diteruskan dari indeks padanan terakhir.

Sebelum setiap pelaksanaan, anda perlu "set semula" regex untuk bermula dari awal:

result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
// 现在的结果是 [true, true]

Apa yang dikatakan, mungkin lebih mudah dibaca untuk mencipta objek RegExp baharu setiap kali (overhead sedikit kerana RegExp sudah dicache):

result.push((/Foo B/gi).test(stringA));
result.push((/Foo B/gi).test(stringB));
P粉523335026

Digunakan dengan g 标志的 RegExp 对象会跟踪匹配发生的 lastIndex jadi dalam perlawanan seterusnya ia akan bermula dari indeks terakhir digunakan dan bukannya bermula dari 0. Lihat contoh:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex);

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

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan