首頁 > web前端 > js教程 > 為什麼具有全域和不區分大小寫標誌的「RegExp」會傳回意外結果?

為什麼具有全域和不區分大小寫標誌的「RegExp」會傳回意外結果?

DDD
發布: 2024-12-21 05:51:10
原創
135 人瀏覽過

Why Does `RegExp` with Global and Case-Insensitive Flags Return Unexpected Results?

全域正規表示式混亂

正規表示式中的全域標誌(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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板