帶有全域標誌的正規表示式的錯誤結果
在提供的程式碼中,使用了正規表示式new RegExp(query , 'gi')帶有g(全域)和i(不區分大小寫)標誌。然而,結果是意想不到的:[true, false]。
理解全域標誌
RegExp 物件中的 g 標誌控制 test() 的行為方法。設定後,test() 從上一個符合結束的位置開始重複搜尋字串中的模式。這稱為“粘性”。
不正確的結果解釋
在範例中,第一次調用re.test('Foo Bar') 找到匹配項「福B.」由於設定了g 標誌,lastIndex 被更新為「Foo B」之後的位置。這意味著對 re.test('Foo Bar') 的後續呼叫從「Foo B」之後的位置開始搜尋。找不到匹配項,導致錯誤結果。
黏性標誌範例
考慮以下程式碼:
var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a"));
此程式碼列印「正確」10 次。由於 reg 有 g 標誌,因此它會堅持最後一個匹配,從上一個匹配之後的位置重複測試“a”,直到字串末尾。
解決方案
要修復原始程式碼,請在每次test() 呼叫之前將re.lastIndex 重設為0:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); result.push(re.test('Foo Bar')); re.lastIndex = 0; result.push(re.test('Foo Bar'));
這可以確保搜尋對於每個test() 調用,從字串的開頭開始,產生[true, true] 的正確結果。
以上是為什麼全域正規表示式的「test()」方法會傳回意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!