【问题标题】:Capturing Multiple Groups with Regex使用正则表达式捕获多个组
【发布时间】:2015-11-24 23:34:28
【问题描述】:

我正在尝试在 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 regex matcher


    【解决方案1】:

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

    .*\{([^}]*)
    

    在java中它会是:

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

    【讨论】:

    • 您介意编辑您的答案以在正则表达式中包含捕获组之前的所有绒毛吗?即ltm virtual MY_VM { rules {等等?
    • 我们为什么需要这些?你只想要“最里面的括号”的东西,不是吗? @user2150250 .*\{ 已经匹配 ltm virtual....{...{...{
    • 最里面的括号最好包括我指定的文本。在我的用例中它不是 100% 必要的,但我真的很想把它放在那里以防万一。
    • 所以ltm virtual MY_VM { 和`规则{`只是固定的??
    • 是的。此外,这似乎匹配单个组中的所有内容,甚至包括 rules { 字符。我希望它在单独的捕获组中匹配 foo_barbazqux-baz
    【解决方案2】:

    @stribizhev 在这个link 上给出的答案也适用于这个问题:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-11
        • 2020-01-02
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多