在Java中获取所有捕获的组

gdx19jrr  于 2023-04-10  发布在  Java
关注(0)|答案(4)|浏览(104)

我想匹配括号内的一个单词(包括括号),我的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

怎么了?

yqkkidmi

yqkkidmi1#

JAVA没有提供一次查找所有匹配项的全局选项。

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

disbfnqx

disbfnqx2#

组不被认为可以找到多个匹配项,而是被认为可以在一个匹配项中识别多个子部分,例如表达式"([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++;
}
yizd12fk

yizd12fk3#

此外,如果你知道你将得到的匹配数量,你可以找到组并将它们添加到列表中,然后在需要时从列表中获取值并将其分配到其他地方

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;
8iwquhpp

8iwquhpp4#

如果你知道匹配组的确切数量,在java 9或更高版本中,可以这样做:

String text = "This_is_a_[sample]_text[notworking]";
    Pattern pattern = Pattern.compile("\\[(\\w*)\\]");
    List<Pair<String, String>> result = pattern.matcher(text).results()
            .map(matchResult -> Pair.of(matchResult.group(0), matchResult.group(1)))
            .toList();

相关问题