【发布时间】:2017-02-28 17:38:55
【问题描述】:
如何获取正则表达式中组选择器的所有连续匹配项?所有匹配项(不仅仅是第一个)意味着我需要使用全局标志 (/g),但使用全局标志无法通过 myString.match() 或 RegExp 在结果数组中获取组.exec(myString)。这两个函数在这种情况下都没有用,因为组合全局标志和组只返回第一个匹配项。
例如,我有 myString = 'Lorem Ipsum group-a-1 blah group-b-1 虚拟简单的打印文本 group -a-2 blah group-b-2 和排版行业' 我想获得 group-a-* 和 group-b-* 对的所有出现.
我可以使用第一个 RegExp 将整个部分与组匹配,然后我需要使用第二个 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() 。有可能吗?
【问题讨论】:
标签: javascript regex