繁体   English   中英

JavaScript分割文字和正则表达式

[英]Javascript split text and 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]));
}

然后发回:

控制台结果

甚至更陌生的东西:

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

退还:

控制台结果

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

我能做什么?

信不信由你,这实际上是预期的行为。 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

您可以在此处注明的位置找到官方文档:

如果您的正则表达式使用“ g”标志,则可以多次使用exec()方法在同一字符串中查找连续的匹配项。 这样做时,搜索将从正则表达式的lastIndex属性指定的str的子字符串开始( 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM