node.js的RegExp不能处理带有'g'标志的多个匹配吗?

3

JavaScript中的RegExp#exec()不能处理带有'g'标志的多个结果吗?如果不能,有什么替代方法?

我有一个像这样的字符串:

a*  2
b   3
c*  4

我希望提取只有星号的那些行。我已经编写了这个正则表达式:

/\w+\*\s+(\d+)\n/g
(即匹配一个单词后面跟着一个字面上的星号,接着是空格、数字捕获组和换行符,并且全局标志被打开)。

在令人愉快的https://regex101.com/#javascript中,将字符串应用于正则表达式会返回两个匹配项,如预期所示:

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

看起来match object不是多维的,或者至少只捕获第一个匹配项。

我是否忽略了一些基本的东西?并且(如我在顶部所问)有合理的替代方案吗?

2个回答

1
我想先说明一下,我对正则表达式知之甚少。但是,我刚刚进行了自己的测试,并发现问题可能出在你的正则表达式中的\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

2
我很欣赏你对学习的投入!我没有在最后一行显示尾随的\n,但它确实存在。请注意,在regex101(如regexr)下我得到了正确的结果。craigts给出了正确的答案。 - fearless_fool
@fearless_fool 哦,那我今天学到了新东西!;) - Singular1ty
3
仅仅因为你发表了学到的内容而被踩,这真是太可惜了。不过这就是StackOverflow丛林法则,说实话,你并没有解决问题的关键:如何使用RegExp#match处理多个匹配项。但请继续学习! - fearless_fool
@fearless_fool 啊,这并不影响我! :) 这都是学习经验。当回答问题时,我总是持开放态度的,因为(至少在我的历史中),往往所问的问题可能完全错误 - 我基于代码和预期输出本身来回答和解决问题,而不是程序员对可能出错的先入为主的想法。无论如何,这仍然是一次有用的经验! - Singular1ty

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);
}

糟糕!我依赖MDN文档——不知道怎么会错过那个。那显然是正确的答案。谢谢。 - fearless_fool

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