使用正規表示式 (RegEx) 時,了解各種標誌對配對行為的影響至關重要。當同時使用全域 (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'));
預期結果:[true, true]
實際結果結果結果:[true, false]
解釋:
RegEx 物件中的 g 標誌可以從最後找到的索引繼續匹配。這意味著找到第一個匹配項後,後續測試將從緊接著上一個匹配項的字元開始繼續搜尋。當模式涉及相同子字串的多個實例時,此行為可能會導致意外結果。
在我們的範例中,初始匹配發生在「Foo Bar」的第一個字元處。然而,第二個測試(沒有 g 標誌)從字串的開頭重新啟動匹配過程,儘管在「Foo」的下一個實例處出現了預期的匹配,但結果卻是錯誤的。
正在解決問題:
要緩解此問題,請考慮使用RegEx 物件的lastIndex 屬性來手動控制每個測試的起始索引,如下所示範例:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); console.log(re.lastIndex); console.log(re.test('Foo Bar')); console.log(re.lastIndex); re.lastIndex = 0; console.log(re.test('Foo Bar')); console.log(re.lastIndex);
此方法允許更可預測的匹配行為,確保每次都針對整個字串評估模式。
以上是為什麼在 JavaScript 的正規表示式中組合「g」和「i」標誌會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!