我的 RegEx 模式有什么问题

What's wrong with my RegEx pattern

我有这个模式:

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

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

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

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

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

这应该有效

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

在 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

您忘记用大括号将组中的字符括起来。

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

应该变成

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

Demo


正面回顾

也许尝试使用积极的回顾?它比我认为的你的解决方案要容易得多,你只需要处理一个组

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