为什么这个正则表达式还匹配非捕获组中的单词?

时间:2015-05-26 01:01:58

标签: javascript regex

我有这个字符串(注意多行语法):

var str = `   Number One: Get this
    Number Two: And this`;

我想要一个返回的正则表达式(使用match):

[str, 'Get this', 'And this']

所以我尝试了str.match(/Number (?:One|Two): (.*)/g);,然后又回来了:

["Number One: Get this", "Number Two: And this"]

在任何"Number"字之前可以有任何空格/换行符。

为什么它只返回捕获组内部的内容?我误会了什么吗?我怎样才能达到预期的效果呢?

3 个答案:

答案 0 :(得分:4)

the MDN documentation for String.match

  

如果正则表达式包含g标志,则该方法返回包含所有匹配的子字符串而不是匹配对象的Array不会返回捕获的组。如果没有匹配项,则该方法返回null

(强调我的)。

所以,你想要的是不可能的。

同一页面添加:

  
      
  • 如果您想获取捕获组并设置了全局标记,则需要使用RegExp.exec()
  •   

所以,如果您愿意继续使用match,您可以编写自己的函数,重复应用正则表达式,获取捕获的子字符串,并构建数组。

或者,根据您的具体情况,您可以写下这样的内容:

var these = str.split(/(?:^|\n)\s*Number (?:One|Two): /);
these[0] = str;

答案 1 :(得分:2)

尝试



  var str = "   Number One: Get this\
    Number Two: And this";
  // `/\w+\s+\w+(?=\s|$)/g` match one or more alphanumeric characters , 
  // followed by one or more space characters ,
  // followed by one or more alphanumeric characters , 
  // if following space or end of input , set `g` flag 
  // return `res` array `["Get this", "And this"]`  
  var res =  str.match(/\w+\s+\w+(?=\s|$)/g);

  document.write(JSON.stringify(res));




答案 2 :(得分:2)

将结果替换并存储在新字符串中,如下所示:

var str = `   Number One: Get this
Number Two: And this`;
var output = str.replace(/Number (?:One|Two): (.*)/g, "$1");
console.log(output);

输出:

Get this
And this

如果你想要你所要求的匹配数组,你可以试试这个:

var getMatch = function(string, split, regex) {
    var match = string.replace(regex, "$1" + split);
    match = match.split(split);
    match = match.reverse();
    match.push(string);
    match = match.reverse();
    match.pop();
    return match;
}

var str = `   Number One: Get this
Number Two: And this`;
var regex = /Number (?:One|Two): (.*)/g;
var match = getMatch(str, "#!SPLIT!#", regex);
console.log(match);

根据需要显示数组:

[ '   Number One: Get this\n    Number Two: And this',
'   Get this',
'\n    And this' ]

split(这里#!SPLIT!#)应该是一个唯一的字符串来分割匹配。请注意,这仅适用于单个组。对于多组,添加一个表示组数的变量,并添加一个构造"$1 $2 $3 $4 ..." + split的for循环。