使用正则表达式捕获多个组

Capturing Multiple Groups with Regex

我正在尝试在 Java 中制定一个正则表达式来捕获多个组。这是字符串(我们称之为 output)我试图从 ...

中捕获
ltm virtual MY_VM {
    rules {
        foo_bar
        baz
        qux-baz
    }
}

我正在尝试捕获最内括号之间的所有内容,即 foo_barbazqux-baz。到目前为止我有...

String regex = "ltm\svirtual\sMY_VM\s\{\s*\n\s*rules\s\{\n\s*([^\n]*)\s*\}\n\s*\}";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

但这当然只有在列表中只有一项时才匹配。如何修改我的正则表达式以匹配最里面括号中的任意数量的捕获组,假设每个组由换行符和任意数量的空格分隔,就像我在我的示例中那样?

到目前为止,我从未在 java 中使用过 regExpr,但是如果我确实正确理解了您的问题,Kleene star 操作将帮助您解决问题。

https://en.wikipedia.org/wiki/Kleene_star

如果不需要配对检查,这应该适合您:

.*\{([^}]*)

在 java 中将是:

String regex = ".*\{([^}]*)";
  • 请注意,您需要 DOTALL 标志
  • 阅读捕获组 1,最里面括号内的所有文本都将在那里。

@stribizhev 在此 给出的答案也适用于此问题:

String regex = "(?:\brules\s+\{|(?!^)\G)\s+([\w-]+)";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}