8

有人可以帮我解释以下代码吗?谢谢。我对正则表达式分组有点困惑。

public static String evaluate(String s) {
    if (s == null) return "";

    Matcher m = Pattern.compile("[0-9]*").matcher(s);

    if (m.find()) {
        MatchResult mr = m.toMatchResult();
        return mr.group(0);
    }
    return "";
}
4

2 回答 2

20

希望这使第0 组更加清晰:

例子:

    String str = "start123456end"; // Your input String


    //                                 Group#1 Group#2
    //                                   |      |  
    Pattern p = Pattern.compile("start([0-9]*)(end)");
    //                           |<--- Group#0 --->|


    Matcher m = p.matcher(str); // Create a matcher for regex and input

    while( m.find() ) // As long as your regex matches something
    {
        System.out.println("group#0:\t" + m.group()); // Or: m.group(0)
        System.out.println("group#1:\t" + m.group(1));
        System.out.println("group#2:\t" + m.group(2));
    }

输出:

group#0:    start123456end
group#1:    123456
group#2:    end

您可以将正则表达式的某些部分“存储”成组。在我的示例中,您有 3 个(组介于(和之间)):

  • 第 1 组:开始词和结束词之间的数字。
  • 第 2 组:结束词
  • 第 0 组:这是与您的模式匹配的全部内容 - 第 0 组是保留的,将始终返回整个匹配项,而其他所有内容都是可选的,由您定义。

根据您的代码:

例子:

Matcher m = Pattern.compile("[0-9]*").matcher("123456end"); // Matches all numbers

if( m.find() )
{
    System.out.println(m.group(0)); // m.group() possible too
}

只有一组:0

输出: 123456(= 组 0)

现在让我们将更多组放入模式中:

代码:

    //                            Group#1      Group#2
    //                              |            |
    Matcher m = Pattern.compile("([0-9])[0-9]([0-9])*").matcher(str); // Matches all numbers
    //                           |<---- Group#0 ---->|

    if( m.find() )
    {
        System.out.println("group#0:\t" + m.group(0)); // m.group() possible too
        System.out.println("group#1:\t" + m.group(1)); // 1st digit
        System.out.println("group#2:\t" + m.group(2)); // 3rd digit
    }

现在还有两个组。

输出:

group#0:    123456
group#1:    1
group#2:    6

我向您推荐此文档:课程:正则表达式。真正从第一章开始,自己尝试例子。

额外的:

于 2013-01-23T16:10:06.527 回答
10

文档中:

零组表示整个模式,因此表达式m.group(0)等价于m.group()

换句话说,mr.group(0)就是整场比赛。

于 2013-01-17T18:39:28.713 回答