同乙個正規表示式兩次匹配結果不通

2021-10-12 08:18:51 字數 2042 閱讀 8104

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 屬性

lastindex 屬性是成功匹配後下一次匹配的開始位置。

對乙個regexp 物件呼叫 test 方法之後,如果成功匹配,regexp物件的lastindex屬性會被設定為匹配結果的結束位置。

當對同乙個regexp 物件第二次呼叫 test 方法時,會從lastindex屬性的位置開始查詢,就不是從頭開始查詢了。

lastindex
lastindex 是正規表示式的乙個可讀可寫的整型屬性,用來指定下一次匹配的起始索引。

只有正規表示式使用了表示全域性檢索的 「g」 標誌時,該屬性才會起作用。此時應用下面的規則:

如果 lastindex 大於字串的長度,則 regexp.test 和 regexp.exec 將會匹配失敗,然後 lastindex 被設定為 0。

如果 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...