Javascript的RegExp#exec()是否使用'g'标志处理多个结果?如果没有,有哪些替代方案?
我有一个这样的字符串:
a* 2
b 3
c* 4
我想只提取那些带星号的行。我写过这个正则表达式:
/\w+\*\s+(\d+)\n/g
(即它匹配一个单词,后跟一个文字星号,后跟空格后跟一个捕获的数字组,后跟换行符,并打开全局标记)。
在令人愉快的https://regex101.com/#javascript中,将字符串应用于regexp会返回两个匹配项,如预期的那样:
Match 1
1. '2'
Match 2
1. '4'
但是在node.js中,我得到了这个:
> match = re.exec(str)
> match
[ 'a* 2\n', '2', index: 0, input: 'a* 2\nb 3\nc* 4\n' ]
看来匹配对象不是多维的,或者至少它只捕获第一场比赛。
我错过了一些基本的东西吗?并且(正如我在顶部所说)是否有一个明智的选择?
答案 0 :(得分:1)
Javascript的RegExp#exec()确实支持多个匹配,但不会一次全部返回。你需要多次调用exec()。 MDN上此功能的文档解释了该问题,并提供了如何将exec()用于多个匹配的示例。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#Examples
var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
var msg = 'Found ' + myArray[0] + '. ';
msg += 'Next match starts at ' + myRe.lastIndex;
console.log(msg);
}
答案 1 :(得分:0)
我将在这个答案前言,说我对Regex知之甚少,但是,我只是进行了自己的测试,发现问题可能出在\n
在你的正则表达式。
要求\n
表示在您发布的代码段中,如果c* 4
后没有换行符,则该行不会匹配。
\w+\*\s+(\d+)
效果很好。
正如我所说,我可能会离这里一英里,但这只是我的想法。
修改:我的测试结果:
/\w+\*\s+(\d+)\n/g
a* 2 [MATCH]
b 3
c* 4
和
/\w+\*\s+(\d+)/g
a* 2 [MATCH]
b 3
c* 4 [MATCH]
使用原文,但在c
之后添加换行符:
/\w+\*\s+(\d+)\n/g
a* 2 [MATCH]
b 3
c* 4 [MATCH]
\n