【问题标题】:What's wrong with my RegEx pattern我的 RegEx 模式有什么问题
【发布时间】:2018-04-07 15:39:03
【问题描述】:

我有这个模式:

Pattern.compile(".*?\\[ISOLATION GROUP (^]+)].*");

我假设这会匹配,例如,这两个字符串:

"[ISOLATION GROUP X] blabla"
"[OTHER FLAG][ISOLATION GROUP Y] blabla"

然后使用group(1) 我可以获得隔离组的名称(在上面的示例中,“X”和“Y”)

但是 matches() 甚至没有返回 true。为什么这些字符串与那个模式不匹配,模式有什么问题?

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

    在 Java 中使用正式的模式匹配器时,我们不需要使用匹配整个输入的模式。相反,只需使用模式\[ISOLATION GROUP ([^\]]+) 来获取所有匹配项:

    String input = "[ISOLATION GROUP X] blabla";
    input += "[OTHER FLAG][ISOLATION GROUP Y] blabla";
    String pattern = "\\[ISOLATION GROUP ([^\\]]+)";
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(input);
    while (m.find()) {
        System.out.println("Found value: " + m.group(1));
    }
    
    Found value: X
    Found value: Y
    

    Demo

    【讨论】:

    • 谢谢。原来我真正的问题是我不知道你必须在这里使用 m.find() 。我只有 if(m.matches()) 但这总是错误的(对于您的示例也是错误的)。从这些方法的文档中我并不清楚为什么我必须这样做..
    • 您的原始模式是错误的,在这两种情况下都不起作用。我认为matches坚持匹配整个输入,这并不是我们真正想要的。我们想遍历整个文本并找到我们正在寻找的内容。
    【解决方案2】:

    您忘记将组的字符括在大括号内。

    .*?\\[ISOLATION GROUP (^]+)].*
    

    应该变成

    .*?\\[ISOLATION GROUP ([^\\]]+)\\].*
    

    Demo


    正向回顾

    尝试使用积极的向后看?它比我认为的解决方案要容易得多,您只需要处理一个组

    (?<=ISOLATION GROUP\s)[^\\]]+
    

    【讨论】:

      【解决方案3】:

      这应该可以工作

      Pattern.compile(".*?\\[ISOLATION GROUP .*\\].*");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2022-06-15
        • 2017-02-17
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        相关资源
        最近更新 更多