Javascript regex exec和test的行为不同

Javascript regex exec和test的行为不同,javascript,node.js,regex,typescript,Javascript,Node.js,Regex,Typescript,我有一个带有一些命名组的正则表达式,当我测试它时匹配良好,但不是作为我跑步应用程序的一部分。 在下面的代码中,regex.exec将在我的应用程序环境中返回null,但在其他任何地方都匹配 /^(goto|gt)(?*)/gim 在节点终端中测试此正则表达式时: /^(goto | gt)(?*)/gim.exec('goto cell')) [ “goto cell”, “转到”, “细胞”, 索引:0, 输入:'转到单元格', 组:[对象:空原型]{roomName:'cell'} ] >

我有一个带有一些命名组的正则表达式,当我测试它时匹配良好,但不是作为我跑步应用程序的一部分。 在下面的代码中,
regex.exec
将在我的应用程序环境中返回null,但在其他任何地方都匹配

/^(goto|gt)(?*)/gim

在节点终端中测试此正则表达式时:

/^(goto | gt)(?*)/gim.exec('goto cell'))
[
“goto cell”,
“转到”,
“细胞”,
索引:0,
输入:'转到单元格',
组:[对象:空原型]{roomName:'cell'}
]
>
我得到了一场快乐的比赛已解析有一个值

现在,当我在应用程序中运行相同的代码时,在调试器中可以看到,
regex.test
会工作,但是
regex.exec()
不会产生任何结果。 解析为空

在这个如此snipper的引擎中,似乎还有另一个问题,即剥离匹配组,但这对我来说在本地是有效的,至少在匹配时是如此

有没有其他的想法来解释为什么这种行为是脆弱的? 我运行的环境、节点版本等都是相同的。 这是typescript,但我检查了传输的代码,结果是一样的

const RouterService={
goto(){console.log('do something')}
}
常量输入='转到单元格'
常量规则={
cname:'转到',
雷克斯:/^(goto|gt)(?*)/gim,
事件:RouterService.goto,
键入:“命令”
}
如果(规则){
const parsed=rule.rex.exec(输入)
console.log('input',input)
console.log('rule',rule)
console.log('parsed',parsed)
parsed.groups={…parsed.groups}//对象空原型
常量parserResult={
解析,规则
}
log('parserResult',parserResult)
}
参考:

因为您使用的是g标志。匹配并返回结果后,正则表达式将从上次运行时停止的位置继续运行。因此,如果使用g标志,则需要重置正则表达式才能正常工作


这就是为什么在您的示例中,第一次运行给您结果,第二次运行给您空值的原因。

这正是原因所在!谢谢这对我来说是一个真正的海森堡。我不知道正则表达式有自己的内部生命周期_(ツ)_/¯