您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關正則表達式中的lastIndex的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
依次寫出下列輸出內容。
var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); // true console.log(reg2.test('abcabc')); // true console.log(reg2.test('abcabc')); // false console.log(reg2.test('abcabc')); // true
很簡單的一個正則表達式測試,查找字符串abcabc中是否有字符a。但是結果卻有一個特殊false存在,Why?
lastIndex(針對于帶參數g的正則表達式)
在每個實例化的RegExp對象中,都存在一個lastIndex屬性,其初始值為0。
/a/.lastIndex // 0 new RegExp('a').lastIndex // 0 lastIndex表示匹配成功時候,匹配內容最后一個字符所在原字符串中的位置 + 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 // 不帶參數g var reg = /ab/; reg.test('123abc'); console.log(reg.lastIndex) // 0
而這個lastIndex也就是用該正則進行其他匹配操作的時候匹配開始的位置。而匹配失敗時重置lastIndex為0。
var reg = /ab/g; // 初始值為0,從最開始匹配 匹配成功, lastIndex為4 console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4 // 從第4位字符"3"開始匹配 匹配內容為第二個ab lastIndex 為 8 console.log(reg.test('12ab34ab'), reg.lastIndex); // true 8 // 從第8位 (字符長度為8,沒有第8位) 開始匹配 匹配不成功 重置lastIndex 為 0 console.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)); // true console.log(reg.test(str2)); // false
很明顯這里因為lastIndex的原因導致判斷錯誤。這里可以修改reg不帶參數g或則重新聲明reg,當然也可以在第一次匹配后手動修改reg.lastIndex = 0。
預查
接著說預查,字面意思就是預備匹配查詢,也就是查詢匹配內容接下來的內容,但是只是預備查詢匹配,并不返回。
經常我們需要匹配到字符串中某些字符后面跟某些字符,但是我們不需要匹配結果中包含后面跟的字符,例如:
找出下面字符串中字符后面是2的所有字符。
var str = 'a1b2c22d31e4fg6h3'; 'a1b2c22d31e4fg6h3'.match(/[a-z]2/g); // ["b2", "c2", "h3"]
這樣,雖然能匹配出字符串帶2的,但是數字2我們并不需要,這里只需要字符。而用預查:
'a1b2c22d31e4fg6h3'.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 = 'a1b2c22d31e4fg6h3'; console.log(reg1.test(str), reg1.lastIndex); // true 3 console.log(reg1.test(str), reg1.lastIndex); // true 5 console.log(reg1.test(str), reg1.lastIndex); // true 16 console.log(reg1.test(str), reg1.lastIndex); // false 0 console.log(reg2.test(str), reg2.lastIndex); // true 4 console.log(reg2.test(str), reg2.lastIndex); // true 6 console.log(reg2.test(str), reg2.lastIndex); // true 17 console.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的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。