在js中我們可能會遇到連續(xù)用同一個正則校驗的情況,這里以校驗郵箱為例
先來一段郵箱的正則
const emailReg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
然后我們先來一個郵箱校驗
emailReg.test("1111111111@qq.com");
// => true
這么一看確實沒問題,但是如果是多個郵箱呢
const emailReg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/g;
console.log(emailReg.test("1111111111@qq.com"));
console.log(emailReg.test("1111111111@qq.com"));
console.log(emailReg.test("1111111111@qq.com"));
console.log(emailReg.test("1111111111@qq.com"));
console.log(emailReg.test("1111111111@qq.com"));
會發(fā)現(xiàn)結果和預期不太一樣了

image.png
原因
這是因為正則表達式如果用變量的方式證明的話,連續(xù)使用時,他會從上一次匹配到的位置繼續(xù)開始,并不是從第0個位置開始匹配的,匹配不到時會返回false,索引位置重新歸0,所以第二次找不到,第三次又找到了
第一次 test("1111111111@qq.com"):匹配成功,返回 true
第二次 test("1111111111@qq.com"):因為位置已經移動,無法匹配,所以返回 false
第三次 test("1111111111@qq.com"):又回到字符串開始,匹配成功,返回 true
第四次 test("1111111111@qq.com"):位置再次移動,無法匹配,返回 false
第五次 test("1111111111@qq.com"):又回到字符串開始,匹配成功,返回 true