Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式捕获多个组_Java_Regex_Matcher - Fatal编程技术网

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

Java 使用正则表达式捕获多个组,java,regex,matcher,Java,Regex,Matcher,我正试图用Java编写一个正则表达式来捕获多个组。这是我试图从中捕获的字符串(让我们调用isoutput) ltm virtual MY_VM { rules { foo_bar baz qux-baz } } 我试图捕捉最里面的括号中的所有内容,即foo_bar,baz,和qux baz。到目前为止我已经 String regex = "ltm\\svirtual\\sMY_VM\\s\\{\\s*\\n\\s*rules\\s

我正试图用Java编写一个正则表达式来捕获多个组。这是我试图从中捕获的字符串(让我们调用is
output

ltm virtual MY_VM {
    rules {
        foo_bar
        baz
        qux-baz
    }
}
我试图捕捉最里面的括号中的所有内容,即
foo_bar
baz
,和
qux 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 uptill中从未使用过正则表达式,但是如果我正确理解您的问题,克莱恩之星行动会帮你的


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

.*\{([^}]*)
在java中,它将是:

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

    • 由@Stribizev在这里给出的答案也适用于这个问题:

      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));
      }
      

      您是否介意编辑您的答案,以便在正则表达式中包含捕获组之前的所有绒毛?例如
      ltm虚拟我的{u VM{rules{
      等等?为什么我们需要这些?你只需要有“最里面的括号”的东西,不是吗?@user215050
      *\{/code>已经匹配了
      ltm虚拟….{…{。。。{
      最里面的括号最好包括我指定的文本。在我的用例中它不是100%必需的,但我真的希望它放在那里以防万一。所以
      ltm-virtual-my_-VM{
      和` rules{`只是固定的??是的。而且,这似乎匹配了单个组中的所有内容,甚至包括
      规则{
      字符。我希望它在单独的捕获组中分别匹配
      foo_bar
      baz
      qux baz