JS:如何在同一个字符串中多次匹配一个捕获组?

时间:2014-10-15 21:28:02

标签: javascript regex

情况

我有一个字符串,我希望多次匹配同一个捕获组。我需要能够参加两场比赛。

示例代码

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

http://jsfiddle.net/npp8jg39/

4 个答案:

答案 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);