node.js RegExp不处理与'g'标志的多个匹配?

时间:2015-07-31 00:22:53

标签: javascript regex node.js

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' ]

看来匹配对象不是多维的,或者至少它只捕获第一场比赛。

我错过了一些基本的东西吗?并且(正如我在顶部所说)是否有一个明智的选择?

2 个答案:

答案 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后没有换行符,则该行不会匹配。

根据我对Regexr的测试,

\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