我有这个字符串(注意多行语法):
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"
字之前可以有任何空格/换行符。
为什么它只返回捕获组内部的内容?我误会了什么吗?我怎样才能达到预期的效果呢?
答案 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循环。