【问题标题】:regex exec and test behaving differently [duplicate]正则表达式执行和测试行为不同[重复]
【发布时间】:2020-07-24 08:52:42
【问题描述】:

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

/^(goto|gt) (?<roomName>.*)/gim

当我在节点终端中测试这个正则表达式时:

> /^(goto|gt) (?<roomName>.*)/gim.exec('goto cell')
[
  'goto cell',
  'goto',
  'cell',
  index: 0,
  input: 'goto cell',
  groups: [Object: null prototype] { roomName: 'cell' }
]
>

我得到了一场快乐的比赛。 解析后有值

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

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

任何其他想法为什么这种行为是片状的? 环境、节点版本等都与我运行的相同。 它是打字稿,但我检查了转译的代码,它是一样的。

const RouterService = {
  goto () { console.log('do something') }
}

const input = 'goto cell'

const rule = {
  cname: 'goto',
  rex: /^(goto|gt) (?<roomName>.*)/gim,
  event: RouterService.goto,
  type: 'command'
}

if (rule) {
  const parsed = rule.rex.exec(input)
  console.log('input', input)
  console.log('rule', rule)
  console.log('parsed', parsed)
  parsed.groups = { ...parsed.groups }  // Object null prototype
  const parserResult = {
    parsed, rule
  }
  console.log('parserResult', parserResult)
}

在 SO 引擎中 解析后有值

但记录我的应用 解析为空

应用调试器: 解析为空

这是 repl.it 上的相同代码,比 SO 引擎更接近一点。

https://repl.it/@dcsan/ChiefAggravatingAlphatest 解析后有值

啊正则表达式。现在我有两个问题。

【问题讨论】:

    标签: javascript node.js regex typescript


    【解决方案1】:

    参考:RegExp.exec() returns NULL sporadically

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

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

    【讨论】:

    • 就是这样!谢谢!这对我来说是一个真正的海森堡。我没有意识到正则表达式有自己的内部生命周期¯_(ツ)_/¯
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多