JavaScript中的奇怪RegExp行为

时间:2016-05-26 16:02:47

标签: javascript regex node.js

我需要捕获字符串中的每个%{string} sequience。 我创建了一个RegExp: /[^%]*(%{[^}]+})?/g, 它在regex101.com(https://regex101.com/r/aB2xL5/1)上的字符串Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}上正常工作,但在JS中不正确: var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
我做错了什么?

我需要什么: Input string: 'abc %{def} ghi %{jkl}' Output array: ['%{def}','%{jkl}']

1 个答案:

答案 0 :(得分:0)

如评论中所述,不要访问整个匹配,即使在regex101上,也包含超出您需要的匹配,而是访问匹配的第一组。

为此,请使用Regex.prototype.exec代替String.prototype.match

var regex=/[^%]*(%{[^}]+})?/g;
var data='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}';
var result=[];
var match;
while (match = regex.exec(data)) {
  result.push(match[1]);  // match the first group of the result
}

编辑:我刚看到托马斯的评论,这比这个解决方案要好得多。我会把它留在这里,因为它确实解决了你的问题,并解释了如何捕获组,但你应该使用他的正则表达式。