JavaScript正则表达式提取数字

3

我有像这样的字符串

(123)abc
defg(456)
hijkl
(999)
7

我希望能够逐个使用正则表达式匹配这些字符串,以提取其中以'('开头,中间有数字,然后是')'以及零个或多个字符的任何数字。所以,在上述5个示例中,我将匹配第一个示例中的123,在第二和第三个示例中没有匹配项,在第四个示例中匹配999,在第五个示例中没有匹配项。
我尝试过这个方法。
var regex = new RegExp("^\((\d+)\)", "gm");
var matches = str.match(regex);

但是匹配总是返回null。我做错了什么吗?

我在regex101上尝试了这个正则表达式,看起来它是有效的,所以我不知道为什么代码不起作用。


当使用 RegExp 构造函数时,您需要为模式和字符串文字提供转义序列 -- new RegExp("^\\((\\d+)\\)", "gm") - Jonathan Lonowski
3个回答

3

我认为您的正则表达式没有问题,可以尝试使用从regex101生成的代码:

var re = /^\((\d+)\)/gm; 
var str = '(123)abc\ndefg(456)\nhijkl\n(999)\n7';
var m;

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    // View your result using the m-variable.
    // eg m[0] etc.
}

演示版

顺便提一下,正如乔纳森·隆诺斯基在他的评论中指出的那样,当您使用RegExp时必须转义反斜杠:

new RegExp("^\\((\\d+)\\)", "gm")

3
您需要将捕获组的结果推送到数组中,为此可以使用exec()方法。
var str = '(123)abc\ndefg(456)\nhijkl\n(999)\n7'
var re  = /^\((\d+)\)/gm, 
matches = [];

while (m = re.exec(str)) {
  matches.push(m[1]);
}

console.log(matches) //=> [ '123', '999' ]

2
您可以使用以下正则表达式:
var regex = /^\((\d+)(?=\))/gm;

并使用捕获组 #1

正则表达式演示

使用正则表达式构造器(注意双重转义):

var regex = new RegExp("^\\((\\d+)(?=\\))", "gm");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接