【问题标题】:One line "preg match all" with groups in JavaScript一行“preg match all”与 JavaScript 中的组
【发布时间】: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


    【解决方案1】:

    最优雅的解决方案似乎是 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;
    

    【讨论】:

    • 你可以使用 sn-ps 让结果看起来更好
    • 在 stackoverflow.com/a/983827/3832970 中接受的答案不处理组,另一个答案使用需要在循环中重复 RegExp 的解决方案。这是关于只执行一个 RegExp 的单行/单命令解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多