在 Java 中获取所有捕获的组

2022-09-02 20:42:04

我想在括号内匹配单个单词(包括括号),我的下面正在工作,但它没有返回我所有组。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));
}

我也在正则表达式星球中测试了它,它似乎有效。

它必须返回 4 组:

------------------------------------
Group 0: [sample]
------------------------------------
Group 1: sample
------------------------------------
Group 2: [notworking]
------------------------------------
Group 3: notworking

但它只是返回它:

------------------------------------
Group 0: [sample]
------------------------------------
Group 1: sample

怎么了?


答案 1

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

Ideone Demo


答案 2

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

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

对于您的情况,如果您想要更多匹配项,请尝试以迭代方式调用。find

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