亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

淺析正則表達式中的lastIndex以及預查

2020-03-16 20:54:41
字體:
來源:轉載
供稿:網友

依次寫出下列輸出內容。

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

很簡單的一個正則表達式測試,查找字符串abcabc中是否有字符a。但是結果卻有一個特殊false存在,Why?

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

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

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

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

var reg = /ab/g;// 初始值為0,從最開始匹配 匹配成功, lastIndex為4console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4// 從第4位字符"3"開始匹配 匹配內容為第二個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的原因導致判斷錯誤。這里可以修改reg不帶參數g或則重新聲明reg,當然也可以在第一次匹配后手動修改reg.lastIndex = 0。

預查

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

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

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

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

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

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

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

我們用test來看看,至于為什么用test這里要說明一下,match是匹配所有,直到匹配不成功的時候結束匹配,而匹配不成功時,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

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

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

按照不會預查的情況會這樣去判斷:

/[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]) 是否有小寫字母 但是是預查 匹配失敗返回false 成功lastIndex不變動,還是為0,同理理解兩外預查內容,最后就是6喂以上的字母數字組合匹配,但是前面都是預查,lastIndex始終未0,每次匹配都是從最開始匹配的,所以滿足要求。

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


注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品第一第二| 国产精品视频自在线| 深夜福利日韩在线看| 国产欧美韩国高清| 亚洲欧美精品在线| 久久久中精品2020中文| 欧美性在线视频| 日本中文字幕不卡免费| 色樱桃影院亚洲精品影院| 亚洲国产精品久久91精品| 日韩欧美精品免费在线| 亚洲精品国产综合久久| 成人黄色大片在线免费观看| 日韩欧美一区二区三区| 亚洲午夜精品久久久久久性色| 欧美福利视频网站| 久久成年人免费电影| 欧美性猛交xxxxx免费看| 色妞欧美日韩在线| 精品国产一区二区三区久久狼5月| 亚洲最大的网站| 欧美午夜视频在线观看| 亚洲第一区在线| 热99精品只有里视频精品| 国产精品日韩在线观看| 久久久精品亚洲| 国产精品a久久久久久| 欧美成人精品激情在线观看| 亚洲国产精品专区久久| 久久精品成人一区二区三区| 在线观看久久久久久| 国内精品美女av在线播放| 欧美一区二区三区图| 欧美一级成年大片在线观看| 国产视频一区在线| 日韩av一区二区在线| 亚洲精品资源在线| 国模极品一区二区三区| 色综合视频一区中文字幕| 热99久久精品| 国产不卡av在线免费观看| 亚洲男人的天堂在线播放| 日韩av电影免费观看高清| 国产丝袜精品第一页| 欧美性猛交xxxx乱大交蜜桃| 日韩欧美高清视频| 国产精品午夜一区二区欲梦| 久久久久久网址| 久久久久国产视频| 中文字幕欧美日韩在线| 97久久精品人人澡人人爽缅北| 久久久久久香蕉网| 91在线视频免费| 久久久久久久999精品视频| 亚洲一级黄色片| 国产美女91呻吟求| 九九久久久久久久久激情| 日韩欧美亚洲范冰冰与中字| 日韩欧美高清在线视频| 久久久999精品免费| 日本精品视频在线播放| 欧美日韩免费一区| 8090理伦午夜在线电影| 国产小视频国产精品| 国产精品欧美一区二区| 国产精品免费视频久久久| 91久久国产综合久久91精品网站| 精品色蜜蜜精品视频在线观看| 日韩视频亚洲视频| 国产精品第七影院| 久久久精品国产亚洲| 亚洲国内精品视频| 成人免费看片视频| 欧美天天综合色影久久精品| 国产91精品久久久久久| 丰满岳妇乱一区二区三区| 日本高清久久天堂| 97精品视频在线| 欧美成人免费在线视频| 欧美成人精品h版在线观看| 国产在线不卡精品| 久久电影一区二区| 国产精品视频中文字幕91| 色偷偷av一区二区三区乱| 日韩电影中文字幕在线观看| 日本高清不卡的在线| 国产精品视频专区| 国产精品678| 九九热这里只有精品免费看| 久久久国产精品免费| 日韩免费黄色av| 中文字幕九色91在线| 国产精品永久在线| 91国语精品自产拍在线观看性色| 亚洲bt欧美bt日本bt| 日本久久91av| 欧美激情高清视频| 亚洲97在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情奇米色| 国产成人精品免高潮在线观看| 亚洲精品成人久久电影| 欧美一区二区三区图| 亚洲综合中文字幕在线| 欧美一区深夜视频| www.日韩免费| 91精品啪aⅴ在线观看国产| 日韩精品免费看| 国产精品视频导航| 成人乱人伦精品视频在线观看| 亚洲国产美女精品久久久久∴| 欧美成人激情视频免费观看| 亚洲一区二区久久久久久久| 91精品国产91久久久久久最新| 亚洲性线免费观看视频成熟| 国产成人一区二区三区小说| 中文在线资源观看视频网站免费不卡| 亚洲国产日韩欧美在线99| 久久久精品久久| 亚洲欧洲视频在线| 日韩av电影在线网| 精品国产91久久久久久| 久久国产精品久久精品| 国产成人亚洲综合91| 欧美做受高潮电影o| 亚洲色图综合久久| 亚洲影视九九影院在线观看| 国产精品视频资源| 成人a视频在线观看| 78色国产精品| 亚洲色图13p| 精品呦交小u女在线| 欧美激情a∨在线视频播放| 国产亚洲视频在线| 中文字幕日韩av电影| 国产成人拍精品视频午夜网站| 国产精品一区二区三区在线播放| 中日韩美女免费视频网址在线观看| 久久影视三级福利片| 中日韩美女免费视频网址在线观看| 亚洲一区二区国产| 久久成人精品视频| 成人黄色av免费在线观看| 91av在线视频观看| 亚洲精品一区二区三区不| 国产精品69久久久久| 日韩久久午夜影院| 91精品在线看| 日韩欧美国产中文字幕| 成人午夜在线视频一区| 成人网在线免费观看| 亚洲精品一区中文字幕乱码| 久久人人爽人人爽人人片亚洲| 亚洲欧美国内爽妇网| 日韩在线观看免费高清完整版| 久久久久久久久久久成人| 国产成人综合精品| 亚洲男女性事视频| 亚洲欧洲在线播放| 国产视频亚洲精品| 亚洲美女精品久久| 青草热久免费精品视频| 日韩福利伦理影院免费| 亚洲欧洲在线观看|