我正在debian下使用Firefox,但我不了解javascript的功能:
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]));
}
它发回:
有些陌生的东西:
for (let t=0; t < test.length; t++)
{
console.log(test[t], testRegex.exec(test[t]), test[t].match(testRegex));
}
发回:
我认为这可能不是编码问题,也不是我的代码。
我该怎么办?
答案 0 :(得分:2)
实际上,这是预期的行为,信不信由你。 JavaScript正则表达式上的exec()
方法是有状态的,旨在成为人们在循环中调用的方法。每次后续执行都将返回字符串中的下一个匹配项,直到没有其他匹配项为止,此时将返回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
您会在以下位置找到此here的官方文档:
如果您的正则表达式使用“ g”标志,则可以多次使用
exec()
方法来查找同一字符串中的连续匹配项。这样做时,搜索将从由正则表达式的str
属性指定的lastIndex
的子字符串开始(test()
也将前进lastIndex
属性)。请注意,lastIndex
属性在搜索其他字符串时不会重置,它将从其现有的lastIndex
开始搜索。
您提供的第二个示例未遇到此问题的原因是,match()
函数在内部将lastIndex
属性重置为0,从而重置了搜索位置并导致对{ {1}}从正则表达式的开头开始搜索。
回到您的原始示例,您可以对其进行如下修改,然后您将看到预期的行为:
exec()