[英]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.