1 回答

TA貢獻1785條經驗 獲得超4個贊
這實際上是預期的行為,信不信由你。exec()JavaScript regex 上的方法是有狀態的,旨在成為人們在循環中調用的東西。每次后續執行都將返回字符串中的下一個匹配項,直到找不到更多匹配項為止,此時null將返回。
為了在第一個示例中突出顯示這一點,讓我們快速簡化一下代碼并顯示每個變量中的值。
let testRegex = /yolo .+ .+/gu;
let test = [
"yolo 2 abc",
"yolo 2 abc"
]
這會導致您的調用testRegex.exec看起來像以下內容:
testRegex.exec("yolo 2 abc") // => Array ["yolo 2 abc"]
testRegex.exec("yolo 2 abc") // => null
您可以在此處找到有關此內容的官方文檔,其中說明:
如果您的正則表達式使用“g”標志,您可以exec()多次使用該方法來查找同一字符串中的連續匹配項。當您這樣做時,搜索從str正則表達式的lastIndex屬性指定的子字符串開始(test()也將推進該lastIndex屬性)。請注意,lastIndex搜索不同的字符串時不會重置該屬性,它將從現有的lastIndex.
您提供的第二個示例沒有遇到此問題的原因是該match()函數在lastIndex內部將屬性重置為 0,重置搜索位置并導致第二次調用exec()從正則表達式的開頭進行搜索。
回到你原來的例子,你可以修改它如下,你會看到你期望的行為:
var testRegex = /yolo .+ .+/gu;
let test = `yolo 2 abc
yolo 2 abc`;
test = test.split('\n');
for (let t=0; t < test.length; t++)
{
console.log(test[t], testRegex.exec(test[t]));
testRegex.lastIndex = 0;
}
添加回答
舉報