用Java获取所有捕获的组

时间:2016-04-29 16:57:48

标签: 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));
}

我也在Regex Planet进行了测试,似乎有效。

必须返回4组:

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

但它正在回归它:

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

怎么了?

3 个答案:

答案 0 :(得分: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++;
   }
}

<强> Ideone Demo

答案 1 :(得分:4)

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

表达式中只有一组(=一个括号对),因此只返回组0(始终是整个匹配的表达式,与手动定义的组无关)和1(您定义的单个组)。< / p>

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

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

答案 2 :(得分:0)

如果您知道将获得的匹配项数量,则可以找到组并将其添加到列表中,然后在需要时将列表中的值分配给其他地方

 public static List<String> groupList(String text, Pattern pattern) {
    List<String> list = new ArrayList<>();
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); i++) {
        list.add(matcher.group(i));
            }
        }
    return list;