一行“preg match all”与JavaScript中的群组

时间:2016-10-19 07:53:25

标签: javascript regex

如何在常规表达中获取群组选择器的所有连续匹配?所有匹配(不仅仅是第一个)意味着我需要使用全局标志(/ g),但是使用全局标志,不可能通过 myString.match() RegExp获取结果数组中的组.exec(myString的)即可。这两种函数对于这种情况都是无用的,因为组合全局标志和组只返回第一次匹配。

例如,我有 myString ='Lorem Ipsum group-a-1 blah group-b-1 虚拟打印组的文本-a-2 blah group-b-2 和排版行业'我希望得到group-a- *和group-b- *对的所有出现

我可以使用第一个RegExp将whoole部分与组匹配,然后我需要使用第二个RegExp(但没有全局标志)来获取组。 使用myString.match()

var matchesOne = myString.match(/(group-a-[0-9]) blah (group-b-[0-9])/gi); // ["group-a-1 blah group-b-1", "group-a-2 blah group-b-2"]
for (var i = 0; i < matchesOne.length; i++) {
    var matchesTwo = matchesOne[i].match(/(group-a-[0-9]) blah (group-b-[0-9])/i); // note missing global flag here
    console.log("WHOLE: " + matchesTwo[0] + ";", "GROUP-A: " + matchesTwo[1] + ";", "GROUP-B: " + matchesTwo[2] + ";");
}
// Result:
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1;
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2;

Developer mozilla推荐使用while循环的类似解决方案。 使用过的RegExp.exec(myString)

var matches, myRegExp = /(group-a-[0-9]) blah (group-b-[0-9])/gi;
while ((matches = myRegExp.exec(myString)) !== null) {
    console.log("WHOLE: " + matches[0] + ";", "GROUP-A: " + matches[1] + ";", "GROUP-B: " + matches[2] + ";");
}
// Result:
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1;
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2;

两种解决方案都需要在循环中多次运行RegExp。但我想在php中使用简单的一个命令/函数,如preg_match_all()。有可能吗?

1 个答案:

答案 0 :(得分:2)

最优雅的解决方案似乎是 myString.replace(),它将不会替换任何内容(我忽略返回值),但有助于轻松获得完整匹配的部分及其组。数据显然存储在单独的变量中,而不是抽象的数字索引数组。

myString.replace(/(group-a-[0-9]) blah (group-b-[0-9])/gi, function(whole, groupA, groupB) {
    console.log("WHOLE: " + whole + ";", "GROUP-A: " + groupA + ";", "GROUP-B: " + groupB + ";");
});
// Result:
// WHOLE: group-a-1 blah group-b-1; GROUP-A: group-a-1; GROUP-B: group-b-1;
// WHOLE: group-a-2 blah group-b-2; GROUP-A: group-a-2; GROUP-B: group-b-2;