正则表达式在Java中查找可选项

正则表达式在Java中查找可选项,java,regex,optional-parameters,Java,Regex,Optional Parameters,我目前正在与regex和struggel一起研究一些东西,最近与regex有很多合作 我想构建一些脚本引擎,为此我需要加载一些预设: 例如: create <Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>] : Creator edit <Type> [after;before;at;between

我目前正在与regex和struggel一起研究一些东西,最近与regex有很多合作

我想构建一些脚本引擎,为此我需要加载一些预设:

例如:

create <Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>] : Creator
edit <Type> [after;before;at;between(2);<Integer>, <DateTime>, <Date>, <Time>, <String>]
run [<File>, <Command>]
我试图使用
\[\(?:,\s++\)+\]
,但它只适用于两个条目->示例
运行[,]
。最好有这些可选元素的“列表”
[,]
。所以最后我想要
m.group(1)=文件;m、 组(2)=命令;m、 第(3)组=布拉布拉等等

我希望我能向你们充分展示我的问题,如果还有什么需要解释的话,可以问我一些问题

这里是指向
regexr
:或
regex101
的链接:

感谢您的帮助:)

是将您要查找的单词之间的内容进行匹配:

public static void main (String[] args) {
    final String STR1 = "run [<File>, <Command1>, <Command2>, <Command3>]";
    final String STR2 = "run [<File>, <Command1>, <Command2>, <Command3>, <Command4>]";

    System.out.println(parse(STR1));
    System.out.println(parse(STR2));
}

private static List parse(String str) {
    List<String> list = new ArrayList<>();

    Pattern p = Pattern.compile("(?:\\G,\\s+|^run\\s+\\[(?:<\\w+>,\\s+)+?)<(\\w+)>");
    Matcher m = p.matcher(str);
    while (m.find()) {
        list.add(m.group(1));
    }

    return list;
}

问题是,至少Java的正则表达式引擎不能为每个捕获组提供多个值,也就是说,您必须提供多个组,如
\[(g1)(g2)?(g3)?(g4)?…\]
,或者使用多个表达式来匹配参数(例如,首先从输入中提取参数,然后应用第二个表达式以及
Matcher.find()
来提取它们)。
在Java正则表达式中并不特殊,不需要在它们前面加反斜杠
public static void main (String[] args) {
    final String STR1 = "run [<File>, <Command1>, <Command2>, <Command3>]";
    final String STR2 = "run [<File>, <Command1>, <Command2>, <Command3>, <Command4>]";

    System.out.println(parse(STR1));
    System.out.println(parse(STR2));
}

private static List parse(String str) {
    List<String> list = new ArrayList<>();

    Pattern p = Pattern.compile("(?:\\G,\\s+|^run\\s+\\[(?:<\\w+>,\\s+)+?)<(\\w+)>");
    Matcher m = p.matcher(str);
    while (m.find()) {
        list.add(m.group(1));
    }

    return list;
}
[Command1, Command2, Command3]
[Command1, Command2, Command3, Command4]