用Java获取所有捕获的组

dev*_*033 8 java regex

我想匹配括号内的单个单词(包括括号),我的Regex下面是有效的,但它并没有让我回到所有组.

这是我的代码:

String text = "This_is_a_[sample]_text[notworking]";
Matcher matcher = Pattern.compile("\\[([a-zA-Z_]+)\\]").matcher(text);                                     
if (matcher.find()) {
    for (int i = 0; i <= matcher.groupCount(); i++) {
    System.out.println("------------------------------------");
    System.out.println("Group " + i + ": " + matcher.group(i));
}
Run Code Online (Sandbox Code Playgroud)

我也在Regex Planet中测试了它,它似乎工作.

它必须返回4组:

------------------------------------
Group 0: [sample]
------------------------------------
Group 1: sample
------------------------------------
Group 2: [notworking]
------------------------------------
Group 3: notworking
Run Code Online (Sandbox Code Playgroud)

但它正在回归它:

------------------------------------
Group 0: [sample]
------------------------------------
Group 1: sample
Run Code Online (Sandbox Code Playgroud)

怎么了?

roc*_*987 9

JAVA不提供花哨的全球选项来一次找到所有比赛.所以,你需要while loop在这里

int i = 0;
while (matcher.find()) {
   for (int j = 0; j <= matcher.groupCount(); j++) {
      System.out.println("------------------------------------");
      System.out.println("Group " + i + ": " + matcher.group(j));
      i++;
   }
}
Run Code Online (Sandbox Code Playgroud)

Ideone演示


mas*_*tov 5

不认为组会找到多个匹配项。他们被认为在单个匹配中识别多个子部分,例如表达式"([A-Za-z]*):([A-Za-z]*)"将匹配一个键值对,您可以将键作为组 1,将值作为组 2。

您的表达式中只有 1 个组(=一对括号),因此只返回组 0(始终是整个匹配的表达式,独立于您手动定义的组)和 1(您定义的单个组)。

在您的情况下,find如果您想要更多匹配项,请尝试迭代调用。

int i = 0;
while (matcher.find()) {
    System.out.println("Match " + i + ": " + matcher.group(1));
    i++;
}
Run Code Online (Sandbox Code Playgroud)