let reg1 =
/^[rr]us[he]$/g
console.
log(reg1.
test
('rush'))
;// true
console.
log(reg1.
test
('rush'))
;// false
console.
log(reg1.
test
('ruse'))
;// true
console.
log(reg1.
test
('ruse'))
;// false
why? 明明正則都是正確的,為啥會出現兩個false?
regexp 物件的 exec 和 test 方法,以及 string 物件的 match、replace、和 split 方法會修改regexp 物件的lastindex 屬性lastindexlastindex 屬性是成功匹配後下一次匹配的開始位置。
對乙個regexp 物件呼叫 test 方法之後,如果成功匹配,regexp物件的lastindex屬性會被設定為匹配結果的結束位置。
當對同乙個regexp 物件第二次呼叫 test 方法時,會從lastindex屬性的位置開始查詢,就不是從頭開始查詢了。
lastindex 是正規表示式的乙個可讀可寫的整型屬性,用來指定下一次匹配的起始索引。如果 lastindex 大於字串的長度,則 regexp.test 和 regexp.exec 將會匹配失敗,然後 lastindex 被設定為 0。只有正規表示式使用了表示全域性檢索的 「g」 標誌時,該屬性才會起作用。此時應用下面的規則:
如果 lastindex 等於字串的長度,且該正規表示式匹配空字串,則該正規表示式匹配從 lastindex 開始的字串。(then the regular expression matches input starting at lastindex.)
如果 lastindex 等於字串的長度,且該正規表示式不匹配空字串 ,則該正規表示式不匹配字串,lastindex 被設定為 0.。
否則,lastindex 被設定為緊隨最近一次成功匹配的下乙個位置。
// 1. 不適用 g
let reg1 =
/^[rr]us[he]$/
console.
log(reg1.
test
('rush'))
;// true
console.
log(reg1.
test
('rush'))
;// true
console.
log(reg1.
test
('ruse'))
;// true
console.
log(reg1.
test
('ruse'))
;// true
// 2. 手動修改 lastindex
let reg1 =
/^[rr]us[he]$/g
console.
log(reg1.
test
('rush'))
;// true
reg1.lastindex =
0console.
log(reg1.
test
('rush'))
;// true
reg1.lastindex =
0console.
log(reg1.
test
('ruse'))
;// true
reg1.lastindex =
0console.
log(reg1.
test
('ruse'))
;// true
同乙個正規表示式測出的結果竟然不同
首先定義了這樣乙個正規表示式 var regex a za z0 9 a za z 0 9 g 然後,alert regex.test 1564sdfs true alert regex.test sadfsaf456 false 而var regex a za z0 9 a za z 0 9 g ...
同乙個 bug 不要修復兩次
noah sussman 曾經寫過一篇文章 你應該測試的東西 軟體系統測試清單 這份清單裡面大部分東西都是有幫助的。然而我覺得它所鼓勵的理念,本質上來說有誤。它的理念基本上是這樣 找出開發者常犯的錯誤,然後確保你寫了測試樣例來檢查你沒有犯了這樣的錯誤。然而這個做法的問題是它本質上是一種 打地鼠 式的...
正規表示式兩次test不一致
今天專案中遇到了乙個奇怪的問題,自己記錄一下,需求是首次登陸的使用者需要修改密碼,需要輸入新密碼兩次 問題就出在這裡了,因為寫了兩個input框,同時還需要校驗密碼強度,這時候正則校驗var reglow newregexp g 密碼強度為低的正則,這時候用乙個正則校驗兩次 兩次結果不一致示例 va...