JS正则表达式未捕获

时间:2018-08-10 12:58:45

标签: javascript regex

我正在尝试编写JavaScript正则表达式。到目前为止,我写的是

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

文本格式

  

名称(可能包含空格),后跟空格,后跟open   括号后跟一个数字,后面紧跟一个括号   更多我不关心的文字。

示例

  

foo bar(123)1.1 / 2.2 3.3%

我已经在几个在线正则表达式测试器(regex101.com和regexr.com)中尝试了上面的代码,并且按我的预期工作,即,它与rparen匹配并包括在内,并捕获但不包括lparen之前的空间。

在Firefox中运行时,匹配项仅是lparen-number-parent,并且捕获为空。我尝试添加gm标志并放置^锚,但无济于事。

2 个答案:

答案 0 :(得分:2)

您的正则表达式似乎运行良好,我在Firefox 61,Chrome 68,IE11和Edge上进行了尝试,并且所有这些都工作正常。在我看来,您正在使用的执行环境不正确支持正则表达式。

这是我测试的内容:

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

因此,首先^,然后捕获所有内容(.*),然后捕获一个空格字符,然后对括号\(进行转义,并匹配其中的所有数字{{1} },最后用括号\d+结束括号。

用例:

  

foo bar(123)

\)

运行以下代码进行测试。

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

  

关于OP答案的注释:为了补充@PaulFloyd的答案,您可以使用var r = /^(.*) \(\d+\)/.exec('foo bar (123)'); console.log(r);捕获不可见的字符,以便使用此正则表达式\s+,即使还有一个额外的^(.*)\s+\(\d+\)

答案 1 :(得分:0)

我发现了问题。我使用Opera调试器看到了它(我猜Chrome也可以完成这项工作)。

从文件中读取了源字符串,并且没有修剪掉换行符,因此输入文本确实是

  

foo bar \ n(123)其他

知道这一点,捕捉并匹配我的期望。

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