全域正規表示式混亂
正規表示式中的全域標誌(g) 旨在搜尋字串中模式的所有出現位置,而不僅僅是第一個。但是,當與不區分大小寫的標誌 (i) 一起使用時,它可能不會產生預期的結果。
問題
考慮以下場景:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // result will be [true, false]
原因
問題的出現是因為全域標誌使RegExp 物件追蹤發生匹配的最後一個索引。在後續配對中,搜尋從該索引開始,而不是從 0 開始。這就是上面範例中發生的情況:
console.log(re.lastIndex); // 0 console.log(re.test('Foo Bar')); // true console.log(re.lastIndex); // 6 console.log(re.test('Foo Bar')); // false console.log(re.lastIndex); // 6
如您所見,第二個匹配結果為“false”,因為搜尋從索引 6,在第一次測試期間已發生匹配。
解決問題
避免這個問題,您可以在匹配之間重置 RegExp 物件的 lastIndex 屬性:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); re.lastIndex = 0; // Reset the last index result.push(re.test('Foo Bar')); // result will be [true, true]
以上是為什麼具有全域和不區分大小寫標誌的「RegExp」會傳回意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!