Apa masalah dengan ekspresi reguler ini ketika saya menggunakan flag global dan flag case-insensitive? Kueri adalah input yang dibuat pengguna. Hasilnya harus [benar, benar].
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]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
tentang
sumber
sumber
re
.Jawaban:
The
RegExp
objek melacaklastIndex
di mana pertandingan terjadi, sehingga pada pertandingan berikutnya akan mulai dari indeks yang terakhir digunakan, bukan 0. Coba lihat:Jika Anda tidak ingin mengatur ulang secara manual
lastIndex
ke 0 setelah setiap pengujian, hapus sajag
flag.Berikut adalah algoritma yang ditentukan oleh spesifikasi (bagian 15.10.6.2):
sumber
lastIndex
adalah dalam langkah 5, 6 dan 11. Pernyataan pembuka Anda hanya benar JIKA BENDERA GLOBAL SET.Anda menggunakan
RegExp
objek tunggal dan menjalankannya beberapa kali. Pada setiap eksekusi berturut-turut, ini berlanjut dari indeks pertandingan terakhir.Anda perlu "mengatur ulang" regex untuk memulai dari awal sebelum setiap eksekusi:
Setelah mengatakan bahwa mungkin lebih mudah dibaca untuk membuat objek RegExp baru setiap kali (overhead minimal karena RegExp di-cache juga):
sumber
g
bendera.RegExp.prototype.test
memperbaruilastIndex
properti ekspresi reguler sehingga setiap tes akan mulai dari yang terakhir dihentikan. Saya sarankan menggunakanString.prototype.match
karena tidak memperbaruilastIndex
properti:Catatan:
!!
mengonversinya menjadi boolean dan kemudian membalikkan boolean sehingga mencerminkan hasilnya.Atau, Anda bisa mereset
lastIndex
properti:sumber
Menghapus
g
bendera global akan memperbaiki masalah Anda.Seharusnya
sumber
Menggunakan flag / g memberitahukannya untuk terus mencari setelah klik
Jika kecocokan berhasil, metode exec () mengembalikan array dan memperbarui properti objek ekspresi reguler.
Sebelum pencarian pertama Anda:
Setelah pencarian pertama
Hapus g dan keluar dari pencarian setelah setiap panggilan ke exec ().
sumber
exec
.Anda perlu mengatur re.lastIndex = 0 karena dengan flag g regex melacak pertandingan terakhir terjadi, jadi tes tidak akan menguji string yang sama, untuk itu Anda perlu melakukan re.lastIndex = 0
sumber
Saya memiliki fungsi:
Panggilan pertama berfungsi. Panggilan kedua tidak. The
slice
Operasi mengeluh tentang nilai null. Saya menganggap ini karenare.lastIndex
. Ini aneh karena saya mengharapkan yang baruRegExp
dialokasikan setiap kali fungsi dipanggil dan tidak dibagi di beberapa pemanggilan fungsi saya.Ketika saya mengubahnya menjadi:
Maka saya tidak mendapatkan
lastIndex
efek penahanan. Ini berfungsi seperti yang saya harapkan.sumber