情况
我有一个字符串,我希望多次匹配同一个捕获组。我需要能够参加两场比赛。
示例代码
var curly = new RegExp("{([a-z0-9]+)}", "gi");
var stringTest = "This is a {test} of my {pattern}";
var matched = curly.exec(stringTest);
console.log(matched);
问题
现在,它只显示第一场比赛,而不是第二场比赛。
JSFiddle Link
答案 0 :(得分:6)
试试这个:
var curly = /{([a-z0-9]+)}/gi,
stringTest = "This is a {test} of my {pattern}",
matched;
while(matched = curly.exec(stringTest))
console.log(matched);

答案 1 :(得分:2)
如果要处理多个结果,则必须在while循环中使用exec方法。请参阅MDN Documentation。
答案 2 :(得分:2)
JavaScript中的字符串有一个match
method - 您可以使用它来匹配正则表达式的所有实例,并以数组形式返回:
stringTest.match(curly);
这将返回一系列匹配项:
> ["{test}", "{pattern}"]
要提取内部值,您可以使用substr
:
var arr = stringTest.match(curly);
arr[0] = arr[0].substr(1, arr[0].length - 2);
> "test"
或转换整个数组:
for (var i = 0; i < arr.length; i++)
arr[i] = arr[i].substr(1, arr[i].length - 2);
> ["test", "pattern"]
答案 3 :(得分:0)
通常,这是通过RegExp.exec
方法完成的,但是您知道它很复杂。每次我需要使用它时,我都必须抬起头来记住此状态操作。就像您需要状态monad之类的东西:)
无论如何。在最近的JS引擎中,有一个String.matchAll()
通过返回迭代器对象以非常理智的方式完成相同的事情。
var curly = new RegExp("{([a-z0-9]+)}", "gi");
var stringTest = "This is a {test} of my {pattern}";
var matches = [...stringTest.matchAll(curly)];
console.log(matches);
如果仅需要捕获组,则只需映射以上结果即可。这次我们使用Array.from()
。
var curly = new RegExp("{([a-z0-9]+)}", "gi");
var stringTest = "This is a {test} of my {pattern}";
var matches = Array.from(stringTest.matchAll(curly), m => m[1]);
console.log(matches);