JavaScript分割文字和正则表达式

时间:2019-06-19 08:58:23

标签: javascript regex

我正在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]));
}

它发回:

Console result

有些陌生的东西:

for (let t=0; t < test.length; t++)
{
    console.log(test[t], testRegex.exec(test[t]), test[t].match(testRegex));
}

发回:

Console result

我认为这可能不是编码问题,也不是我的代码。

我该怎么办?

1 个答案:

答案 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()