a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Regex > 正文

淺析正則表達(dá)式中的lastIndex以及預(yù)查

2020-03-16 20:54:41
字體:
供稿:網(wǎng)友

依次寫出下列輸出內(nèi)容。

var reg1 = /a/;var reg2 = /a/g;console.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // falseconsole.log(reg2.test('abcabc')); // true

很簡單的一個正則表達(dá)式測試,查找字符串a(chǎn)bcabc中是否有字符a。但是結(jié)果卻有一個特殊false存在,Why?

lastIndex(針對于帶參數(shù)g的正則表達(dá)式)

在每個實例化的RegExp對象中,都存在一個lastIndex屬性,其初始值為0。

/a/.lastIndex // 0new RegExp('a').lastIndex // 0lastIndex表示匹配成功時候,匹配內(nèi)容最后一個字符所在原字符串中的位置 + 1,也就是匹配內(nèi)容的下一個字符的index(如果匹配內(nèi)容在字符串的結(jié)尾,同樣返回原字符串中的位置 + 1,也就是字符串的length)。如果未帶參數(shù)g,lastIndex始終為0。var reg = /ab/g;reg.test('123abc');console.log(reg.lastIndex) // 5// 匹配內(nèi)容在最后var reg = /ab/g;reg.test('123ab');console.log(reg.lastIndex) // 5// 不帶參數(shù)gvar reg = /ab/;reg.test('123abc');console.log(reg.lastIndex) // 0

而這個lastIndex也就是用該正則進(jìn)行其他匹配操作的時候匹配開始的位置。而匹配失敗時重置lastIndex為0。

var reg = /ab/g;// 初始值為0,從最開始匹配 匹配成功, lastIndex為4console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4// 從第4位字符"3"開始匹配 匹配內(nèi)容為第二個ab lastIndex 為 8console.log(reg.test('12ab34ab'), reg.lastIndex); // true 8// 從第8位 (字符長度為8,沒有第8位) 開始匹配 匹配不成功 重置lastIndex 為 0console.log(reg.test('12ab34ab'), reg.lastIndex); // false 0// 從頭匹配 同第一步console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4

看到這里題目也就解答完畢,接下來是擴展。

對于未重新聲明的reg容易犯錯的地方。

// 測試字符串str1 和 str2 是否都含有ab字符var reg = /ab/g;var str1 = '123ab';var str2 = 'ab123';console.log(reg.test(str1)); // trueconsole.log(reg.test(str2)); // false

很明顯這里因為lastIndex的原因?qū)е屡袛噱e誤。這里可以修改reg不帶參數(shù)g或則重新聲明reg,當(dāng)然也可以在第一次匹配后手動修改reg.lastIndex = 0。

預(yù)查

接著說預(yù)查,字面意思就是預(yù)備匹配查詢,也就是查詢匹配內(nèi)容接下來的內(nèi)容,但是只是預(yù)備查詢匹配,并不返回。

經(jīng)常我們需要匹配到字符串中某些字符后面跟某些字符,但是我們不需要匹配結(jié)果中包含后面跟的字符,例如:

找出下面字符串中字符后面是2的所有字符。

var str = 'a1b2c22d31e4fg6h2';'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]

這樣,雖然能匹配出字符串帶2的,但是數(shù)字2我們并不需要,這里只需要字符。而用預(yù)查:

'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]

可以看到完全滿足條件,但是預(yù)查和本文的主題lastIndex又有幾毛錢的關(guān)系呢?

我們用test來看看,至于為什么用test這里要說明一下,match是匹配所有,直到匹配不成功的時候結(jié)束匹配,而匹配不成功時,lastIndex就被重置為0了。

而exec和test是第一次匹配成功或者匹配失敗就返回,并不會接著往下匹配。

var reg1 = /[a-z](?=2)/g;var reg2 = /[a-z]2/g;var str = 'a1b2c22d31e4fg6h2';console.log(reg1.test(str), reg1.lastIndex); // true 3console.log(reg1.test(str), reg1.lastIndex); // true 5console.log(reg1.test(str), reg1.lastIndex); // true 16console.log(reg1.test(str), reg1.lastIndex); // false 0console.log(reg2.test(str), reg2.lastIndex); // true 4console.log(reg2.test(str), reg2.lastIndex); // true 6console.log(reg2.test(str), reg2.lastIndex); // true 17console.log(reg2.test(str), reg2.lastIndex); // false 0

看出問題沒有?預(yù)查的lastIndex不包含預(yù)查內(nèi)容! 這里就可以用來簡化很多判斷了。

例如我們要匹配密碼必須有至少一個大寫字母,一個小寫字母,一個數(shù)字,并且長度至少6位而且只能是數(shù)字字母組合。

按照不會預(yù)查的情況會這樣去判斷:

/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && //d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);

但是:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*/d)[a-zA-Z0-9]{6,}$/.test(pwd)

分解出來看:

(?=.*[a-z]) 是否有小寫字母 但是是預(yù)查 匹配失敗返回false 成功lastIndex不變動,還是為0,同理理解兩外預(yù)查內(nèi)容,最后就是6喂以上的字母數(shù)字組合匹配,但是前面都是預(yù)查,lastIndex始終未0,每次匹配都是從最開始匹配的,所以滿足要求。

以上所述是小編給大家介紹的淺析正則表達(dá)式中的lastIndex以及預(yù)查,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到正則表達(dá)式頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲人成中文字幕在线观看 | 久久久精品一区 | 少妇撒尿一区二区在线视频 | 国产农村妇女精品 | 日本黄色网址大全 | 成人综合av | 国产aaa一级毛片 | 亚洲六月丁香色婷婷综合久久 | 草逼视频免费观看 | 日韩精品一区二区三区四区 | 国产精品.xx视频.xxtv | 亚洲精品中文字幕 | 日本中文在线 | 国产精品一区人伦免视频播放 | 亚洲精彩视频在线观看 | 欧美成人a| 欧美日韩一区二区中文字幕 | 国产亚洲精品久 | 久久9国产偷伦 | 一区二区三区四区在线 | 国产不卡在线播放 | 国产日韩欧美一区 | 免费观看黄色大片 | 国产精品视频一区二区三区, | 中文字幕日韩在线 | 久久99这里只有精品 | 欧美在线三级 | 亚洲激情视频在线观看 | 日韩精品一区二区三区 | 久久国产香蕉视频 | 在线一区二区三区 | 日韩精品一区二区三区在线 | 网站av| 国产美女精品人人做人人爽 | 黄页免费看 | 日本三级黄色录像 | 日韩在线一区二区三区 | 久草成人 | 久久精品一区二区 | 久久久毛片| 亚洲中午字幕 |