【问题标题】:Regex do not capture group in JavaScript正则表达式不捕获 JavaScript 中的组
【发布时间】:2021-08-26 17:02:55
【问题描述】:

我写了正则表达式

/translateX\((?<X>-{0,1}\d+)px\)|translateY\((?<Y>-{0,1}\d+)px\)/g

对于给定的字符串

translateX(381px) translateY(-94px)

捕获translateXtranslateY 值。通过 regex101.com 服务对其进行了测试,它在那里运行良好。但是,当我在 JavaScript 中尝试它时,它会捕获 translateX 值,即 381,但不会捕获 translateY,即 -94。你知道为什么会这样吗?

regex101

https://i.stack.imgur.com/Nuj5X.png

JavaScript 执行

console.log(/translateX\((?&lt;X&gt;-{0,1}\d+)px\)|translateY\((?&lt;Y&gt;-{0,1}\d+)px\)/g.exec("translateX(381px) translateY(-94px)"));

使用matchAll 会得到相同的结果。

JavaScript 匹配所有

console.log("translateX(381px) translateY(-94px)".matchAll(/translateX\((?&lt;X&gt;-{0,1}\d+)px\)|translateY\((?&lt;Y&gt;-{0,1}\d+)px\)/g).next().value.groups);

【问题讨论】:

  • 考虑将问题中使用的 JS 添加为 minimal reproducible example?
  • 仅供参考,{0,1} 通常写成? 表示可选模式。
  • 在最后一个例子中你只调用了一次.next(),所以你只能得到第一个匹配。尝试将其转换为数组,您将获得所有匹配项。

标签: javascript regex string


【解决方案1】:

您只调用了一次.next(),因此您只能获得第一个匹配项。 你需要遍历.matchAll()的所有结果。

for (m of "translateX(381px) translateY(-94px)".matchAll(/translateX\((?<X>-{0,1}\d+)px\)|translateY\((?<Y>-{0,1}\d+)px\)/g)) {
  console.log(m.groups);
}

您还可以将迭代器转换为数组。

console.log([..."translateX(381px) translateY(-94px)".matchAll(/translateX\((?<X>-{0,1}\d+)px\)|translateY\((?<Y>-{0,1}\d+)px\)/g)]
    .map(m => m.groups)) 

【讨论】:

    【解决方案2】:

    您可以使用它一次性找到这两个值:

    /translateX\((?&lt;X&gt;-?\d+)px\).*translateY\((?&lt;Y&gt;-?\d+)px\)/g

    console.log(/translateX\((?&lt;X&gt;-?\d+)px\).*translateY\((?&lt;Y&gt;-?\d+)px\)/g.exec("translateX(381px) translateY(-94px)"));

    【讨论】:

    • 是的,但是我想写一个表达式来找到 translateX 和 translateY 而不管它们的位置。像 translateX(n) translateY(n) 或 translateY(n) translateX(n) - 这是有效的 css 转换值。
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2018-03-11
    相关资源
    最近更新 更多