首页 > 解决方案 > 是否有可能选择组中的所有备选方案

问题描述

在我的正则表达式中有一个有 3 个选项的组。在正则表达式测试之后,只有最后出现的替代项被选择到选择组中。是否有可能选择所有发生的替代方案?

我曾经regex101测试我的结果。

https://regex101.com/r/iBxX9V/4

如果这对您不起作用,这里有一个自动生成的代码来测试这个正则表达式:

const regex = /clone\s+([^ \/]+)\s+([^ \/]+)(?:\s*(?:--(flag1|flag2|flag3)))*$/gm;
const str = `clone
clone a b
clone a b --flag1
clone a b  --flag1 --flag2
clone a b --flag1 --unknown
clone a b -- --
clone a b    --flag1   --flag2 --flag3`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

目前,正则表达式匹配只会返回最后一次出现的替代项。

示例clone a b --flag1 --flag2 --flag3

"match":[ 
    "clone a b    --flag1   --flag2 --flag3",
    "a",
    "b",
    "flag3"
],

我想知道有没有办法得到

"match":[ 
    "clone a b    --flag1   --flag2 --flag3",
    "a",
    "b",
    ["flag1", "flag2", "flag3"]
],

或者

"match":[ 
    "clone a b    --flag1   --flag2 --flag3",
    "a",
    "b",
    "flag1",
    "flag2",
    "flag3"
],

注意:标志可以随机出现。

示例:https ://regex101.com/r/iBxX9V/7

任何帮助和提示表示赞赏。

标签: regexregex-group

解决方案


你可以为每个标志做一个单独的组,然后你就会把它们都抓起来

clone\s+([^ \/]+)\s+([^ \/]+)(?:\s*(?:(--flag1)*\s*(--flag2)*\s*(--flag3)*))*$

https://regex101.com/r/iBxX9V/6


推荐阅读