javascript - ungkapan biasa js akan menjadi pelik jika anda menggunakan ^ dan $ dan kemudian menggunakan g, tetapi tiada ralat akan dilaporkan
伊谢尔伦
伊谢尔伦 2017-05-19 10:40:32
0
2
518
var reg1 =  /^1$/g;
var reg2 = /^1$/;
for (var i = 0; i < 10; i++) {
    console.log(reg1.test('1')) // true false true false true false true false ...
    console.log(/^1$/g.test('1')) // true  true  true  true  true  true  true ...
    console.log(reg2.test('1')) // true  true  true  true  true  true  true ...
    console.log(/^1$/.test('1')) // true  true  true  true  true  true  true ...
}

Kenapa keluaran console.log pertama begini?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(2)
世界只因有你

Apabila ungkapan biasa dilaksanakan, Indeks terakhir objek RegExp mungkin berubah.

Kaedah

ujian digunakan untuk mengesan sama ada rentetan sepadan dengan peraturan biasa tertentu Selagi rentetan mengandungi teks yang sepadan dengan peraturan biasa, kaedah itu akan mengembalikan benar, jika tidak, ia mengembalikan palsu.

Malah, jika ungkapan biasa mempunyai bendera global (dengan parameter g), kaedah ujian juga dipengaruhi oleh atribut lastIndex objek biasa, seperti berikut:

var reg = /[a-z]+/;//正则不带全局标志
console.log(reg.test("abc"));//true
console.log(reg.test("de"));//true

var reg = /[a-z]+/g;//正则带有全局标志g
console.log(reg.test("abc"));//true
console.log(reg.lastIndex);//3, 下次运行test时,将从索引为3的位置开始查找
console.log(reg.test("de"));//false

Impak ini akan dianalisis dalam penjelasan kaedah exec.

Kaedah

exec digunakan untuk mengesan padanan rentetan dengan ungkapan biasa Jika teks yang sepadan ditemui, ia mengembalikan tatasusunan hasil, jika tidak, ia mengembalikan nol.

Sintaks: exec(rentetan)

Tatasusunan yang dikembalikan oleh kaedah

exec mengandungi dua atribut tambahan, indeks dan input Dan tatasusunan mempunyai ciri-ciri berikut:

  • Item ke-0 mewakili teks yang ditangkap oleh ungkapan biasa

  • Item pertama~n mewakili rujukan belakang ke-1, yang seterusnya menghala ke teks yang ditangkap dalam kumpulan ke-1 Anda boleh menggunakan RegExp.$ + "Nombor 1~n" untuk mendapatkan teks dalam kumpulan mengikut urutan

  • indeks mewakili kedudukan awal rentetan yang dipadankan

  • input mewakili rentetan yang sedang diambil

Tidak kira sama ada ungkapan biasa mempunyai bendera global "g" atau tidak, kelakuan exec adalah sama Tetapi kelakuan objek ungkapan biasa adalah agak berbeza berbeza.

Anggap bahawa objek ungkapan biasa ialah reg, aksara yang dikesan ialah rentetan dan nilai pulangan reg.exec(rentetan) ialah tatasusunan.

Jika reg mengandungi tanda global "g", maka atribut reg.lastIndex mewakili kedudukan selepas penghujung rentetan yang dipadankan dalam rentetan asal, iaitu kedudukan di mana padanan seterusnya bermula Pada masa ini, reg.lastIndex == tatasusunan.index (padankan kedudukan Mula) + tatasusunan[0].panjang (padanan dengan panjang rentetan seperti berikut:

var reg = /([a-z]+)/gi,
    string = "World Internet Conference";
var array = reg.exec(string);
console.log(array);//["World", "World", index: 0, input: "World Internet Conference"]
console.log(RegExp.);//World
console.log(reg.lastIndex);//5, 刚好等于 array.index + array[0].length

Apabila pengambilan diteruskan, nilai array.index akan dinaikkan, iaitu, nilai reg.lastIndex juga akan ditambah secara serentak Oleh itu, kita juga boleh melintasi semua padanan dalam rentetan dengan memanggil kaedah exec berulang kali Teks. Apabila kaedah exec tidak lagi sepadan dengan teks, ia akan mengembalikan null dan menetapkan semula sifat reg.lastIndex kepada 0.

Berikutan contoh di atas, kami terus melaksanakan kod untuk melihat sama ada perkara di atas adalah betul, seperti yang ditunjukkan di bawah:

array = reg.exec(string);
console.log(array);//["Internet", "Internet", index: 6, input: "World Internet Conference"]
console.log(reg.lastIndex);//14

array = reg.exec(string);
console.log(array);//["Conference", "Conference", index: 15, input: "World Internet Conference"]
console.log(reg.lastIndex);//25

array = reg.exec(string);
console.log(array);//null
console.log(reg.lastIndex);//0

Dalam kod di atas, kerana kaedah exec dipanggil berulang kali, sifat reg.lastIndex akhirnya ditetapkan semula kepada 0.

Semakan Masalah

Dalam penjelasan kaedah ujian, kami meninggalkan masalah Jika ungkapan biasa mempunyai bendera global g, hasil pelaksanaan kaedah ujian di atas akan dipengaruhi oleh reg.lastIndex. Bukan itu sahaja, kaedah exec juga sama. Memandangkan reg.lastIndex Nilai tidak selalunya sifar, dan ia menentukan kedudukan permulaan padanan seterusnya Jika anda ingin mula mendapatkan rentetan baharu selepas melengkapkan padanan dalam rentetan, anda mesti menetapkan semula atribut lastIndex 0. Elakkan ralat berikut:

var reg = /[0-9]+/g,
    str1 = "123abc",
    str2 = "123456";
reg.exec(str1);
console.log(reg.lastIndex);//3
var array = reg.exec(str2);
console.log(array);//["456", index: 3, input: "123456"]

Hasil pelaksanaan yang betul bagi kod di atas hendaklah "123456", jadi adalah disyorkan untuk menambah "reg.lastIndex = 0;" sebelum melaksanakan kaedah exec untuk kali kedua.

Jika reg tidak mengandungi bendera global "g", maka hasil pelaksanaan (tatasusunan) kaedah exec akan betul-betul sama dengan hasil pelaksanaan kaedah string.match(reg).

Snippet ini datang daripada Manual Pengguna Front-End Expression |

巴扎黑

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan