【问题标题】:UnhandledPromiseRejectionWarning: SyntaxError: Invalid regular expression: /\?(?<query>.*)/: Invalid group [duplicate]UnhandledPromiseRejectionWarning: SyntaxError: Invalid regular expression: /\?(?<query>.*)/: Invalid group [重复]
【发布时间】:2021-02-02 17:58:11
【问题描述】:

我一直在研究用于 url 查询的解析器,但我很困惑为什么正则表达式在测试期间通过 regex101.com 工作时不正确或者至少我认为确实如此,这是一个深夜编码;

无论如何,我在 StackOverflow 或 Good Ol'e google 中都没有找到任何答案。

问题:UnhandledPromiseRejectionWarning: SyntaxError: Invalid regular expression: /\?(?&lt;query&gt;.*)/: Invalid group

   const results = url.match(/\?(?<query>.*)/);
    if (!results) {
        return {};
    }
    const { groups: { query } } = results;

    const pairs = query.match(/(?<param>\w+)=(?<value>\w+)/g);
    const params = pairs.reduce((acc, curr) => {
        const [key, value] = curr.split(("="));
        acc[key] = value;
        return acc;
    }, {});
    return params;

【问题讨论】:

  • Node JS 不是 ecmascript 吗?我以为 JS 是由浏览器控制的。
  • @Maxt8r JS 可以在许多平台上运行。诚然,它在客户端的浏览器上最为常见,但它也可以在后端的服务器(使用 Node.js)或桌面应用程序(使用 Electron)等上运行。

标签: javascript node.js regex


【解决方案1】:

命名捕获组仅在 Node 10+ 中受支持,according to MDN。您需要更新您的节点版本。 (低于 10 的节点版本为 very old,即使不是因为这个问题,更新也是个好主意)

如果由于某种原因不允许您这样做,您可以将其设为普通捕获组而不是命名捕获组:

/\?(.*)/

然后从匹配中提取第一组 ([1])。从查询字符串中提取对也是一样的。

在现代版本的 Node 上,您还可以使用语义更丰富的 Object.fromEntries 而不是 reduce

const params = Object.fromEntries(
  pairs.map(pair => pair.split('='))
);

【讨论】:

  • 哦,我什至没有意识到我的节点在v8.11.4 大声笑;好久没上这台电脑了。谢谢你的建议。
  • 对不起,@CertainPerformance 我忘了这样做,现在才这样做;我在四处奔波xD
猜你喜欢
  • 2022-06-28
  • 2022-01-09
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2020-02-04
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多