代码之家  ›  专栏  ›  技术社区  ›  Paul Floyd

JS regex未捕获

  •  -1
  • Paul Floyd  · 技术社区  · 6 年前

    我正在尝试编写一个javascript regexp。到目前为止我写的是

    function getName(text) {
        var r = /(.*) \(\d+\)/.exec(text);
        if (r && r.length>1) {
            return r[1];
        } else {
            return "";
        }
    }
    

    文本的格式是

    名称(可能包含空格)后跟空格和open parens后跟一个数,后跟一个紧parens,后跟 更多我不在乎的文字。

    例子

    福巴(123)1.1/2.2 3.3%

    我在两个在线regexp测试程序(regex101.com和regexr.com)中尝试过上述代码,它的工作原理与我预期的一样,也就是说,它匹配并包含rpare,捕获lparen之前的空间,但不包括lparen之前的空间。

    在Firefox中运行时,匹配项仅为空间lparent number rparent,捕获为空。我试着加上 gm 旗帜和放置 ^ 锚,没用。

    2 回复  |  直到 6 年前
        1
  •  3
  •   lenilsondc    6 年前

    你的regex看起来运行良好,我在Firefox 61、Chrome 68、IE11和Edge上试过了,所有这些都运行良好。在我看来,您正在使用的执行环境不正确地支持regex。

    以下是我测试的:

    /^(.*) \(\d+\)/
    

    所以首先 ^ ,然后捕获所有内容 (.*) ,然后是空格字符 ,然后转义括号打开 \( ,匹配其中的所有数字 \d+ 最后转义括号结束 \) .

    用例:

    foo酒吧(123)

    [
      "foo bar (123)", // the whole match ^(.*) \(\d+\)/
      "foo bar",       // first capture group (.*)
    ]
    

    运行下面的代码片段进行测试。

    var r = /^(.*) \(\d+\)/.exec('foo bar (123)');
    
    console.log(r);

    关于OP的回答: 为了补充@PaulFloyd的答案,您可以使用 \s+ 捕获不可见字符,以便使用此正则表达式 ^(.*)\s+\(\d+\) 你可以实现你的目标,即使有额外的 \n 空间。

        2
  •  0
  •   Paul Floyd    6 年前

    我发现了问题。我看到它使用了Opera调试器(我想Chrome也会这么做)。

    源字符串是从文件中读取的,并且有一个新行没有被修剪,所以输入的文本实际上是

    foo bar\n(123)其他内容

    知道了这一点,抓捕并符合我的期望。

    (Opera调试器显示了嵌入的换行符)。