具有全域標誌(g) 的正規表示式(RegExp) 通常用於尋找某個模式在其中多次出現的情況一個字串。但是,將此標誌與不區分大小寫的標誌 (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]
在這種情況下,測試方法僅傳回在第一次迭代中為 true。要理解這種行為,我們需要考慮 g 標誌的工作原理。
當與 g 標誌一起使用時,RegExp 物件會追蹤最後一個索引發生比賽的地方。在後續匹配中,RegExp 將從最後一個索引開始搜索,而不是 0。
說明這個概念:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); console.log(re.lastIndex); // Initial value is 0 console.log(re.test('Foo Bar')); // Matches at index 0 console.log(re.lastIndex); // Updated to 6 console.log(re.test('Foo Bar')); // No match, lastIndex is still 6 console.log(re.lastIndex); // Remains at 6
在此範例中,即使Foo Bar 字串包含另一個符合項,第二個測試呼叫傳回false,因為RegExp 已經將其搜尋位置移動到了匹配項之後。
因此,將 g 標誌與 i 標誌結合使用可以如果搜尋字串包含大小寫不同的模式的多個實例,則會導致遺失符合項。為了避免這種情況,請考慮使用不含 g 標誌的 i 標誌,或使用帶有 g 標誌的單一測試呼叫來僅查找第一個匹配項。
以上是為什麼 RegExp 中的全域標誌通過多次測試會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!