我正在尝试编写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
标志并放置^
锚,但无济于事。
答案 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调试器显示了嵌入式换行符)。