【问题标题】:Named groups and OR operator in JSJS中的命名组和OR运算符
【发布时间】:2019-07-15 13:39:28
【问题描述】:

我正在尝试匹配诸如 2h30m、24h、1d20h30s 之类的字符串,并使用命名组提取每个段。听起来简单可行,如果您将 PCRE 与如下正则表达式一起使用:

^(((?<h>[0-9]+)h)|((?<m>[0-9]+)m))+$

完整示例见regexr,右上角可以切换PCRE和Javascript引擎。

问题是它在 javascript 中不起作用,我不知道为什么。我的猜测是它与 OR 运算符和命名组之间的交互有关,因为在使用 javascript 时,它只返回一个命名组

问题是为什么?如果有任何方法可以在 javascript 中完成这项工作

【问题讨论】:

    标签: javascript node.js regex pcre


    【解决方案1】:

    看来|应该换成?来连续抓几组(用|,一行只能抓到最后一个组)。我们需要添加一个非空断言来防止空字符串匹配。此外,值得插入一些?: 以使某些组不被捕获。

    'use strict';
    
    const str = `
    2h30m
    24h
    1d20h30s
    `;
    
    const re = /^(?=.+)(?:(?:(?<d>[0-9]+)d)?(?:(?<h>[0-9]+)h)?(?:(?<m>[0-9]+)m)?(?:(?<s>[0-9]+)s)?(?:(?<ms>[0-9]+)ms)?)+$/gm;
    
    let result;
    
    while (result = re.exec(str)) console.log(result.groups);

    如果你的 Node.js(或浏览器)支持新的matchAll() 方法,也可以这样实现:

    'use strict';
    
    const str = `
    2h30m
    24h
    1d20h30s
    `;
    
    const re = /^(?=.+)(?:(?:(?<d>[0-9]+)d)?(?:(?<h>[0-9]+)h)?(?:(?<m>[0-9]+)m)?(?:(?<s>[0-9]+)s)?(?:(?<ms>[0-9]+)ms)?)+$/gm;
    
    console.log(Array.from(str.matchAll(re), ({ groups }) => groups));

    【讨论】:

    • 不错!我正在使用类似的东西,但唯一的问题是这个解决方案不能处理无序字符串,比如'30m2h',但是谢谢!
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2014-05-05
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多