我的Java正则表达式没有捕获该组

时间:2010-03-11 21:39:12

标签: java regex

我正在尝试将用户名与正则表达式进行匹配。请不要建议拆分。

USERNAME=geo

这是我的代码:

    String input = "USERNAME=geo";
    Pattern pat = Pattern.compile("USERNAME=(\\w+)");
    Matcher mat = pat.matcher(input);
    if(mat.find()) {
        System.out.println(mat.group());
    }

为什么不在群组中找到geo?我注意到,如果我使用.group(1),它会找到用户名。但是,group方法包含USERNAME=geo。为什么呢?

5 个答案:

答案 0 :(得分:5)

因为group()等同于group(0),而0组表示整个模式。

来自documentation

  

public String group(int group)

     

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

正如您所发现的,使用您的模式,group(1)可以为您提供所需内容。

如果您坚持使用group(),则必须将模式修改为"(?<=USERNAME=)\\w+"

答案 1 :(得分:3)

正如Matcher.group() javadoc所说,它“返回与前一个匹配项匹配的输入子序列”,而您之前的匹配是“USERNAME = geo”,因为您已调用find()。< / p>

相反,方法group(int)会返回特定的组。捕获组的编号是从左到右计算它们的左括号,因此第一组在您的情况下将匹配“geo”。

答案 2 :(得分:1)

那是因为group 假设返回与整个模式匹配的字符串。要在该字符串中获取,您需要传递所需的组号。

有关详情,请参阅here,转述如下:

  

<强>组

     

public String group()
  返回上一个匹配项匹配的输入子序列。

     

public String group(int group)
  返回上一个匹配操作期间给定组捕获的输入子序列   捕获组从左到右编制索引,从1开始。组零表示整个模式,因此表达式m.group(0)等效于m.group()。

答案 3 :(得分:1)

因此VAR.group(int i)将返回正则表达式的第i个捕获组。 0表示完整字符串。你需要打电话给.group(1)

答案 4 :(得分:1)

对于您的解决方案,这是有效的:

public static void main(String[] args) {
        String input = "USERNAME=geo";
        Pattern pat = Pattern.compile("USERNAME=(\\w+)");
        Matcher mat = pat.matcher(input);
        if(mat.find()) {
            System.out.println(mat.group(1));
        }
    }

<强>输出 地理

原因

  

String java.util.regex.Matcher.group(int   基)   
返回输入子序列   在此期间被特定群体捕获   上一场比赛。

     

对于匹配器m,输入序列s和   组索引g,表达式   m.group(g)和s.substring(m.start(g),   m.end(g))是等价的。