我的Java正则表达式不是';我们不能抓住这个群体

我的Java正则表达式不是';我们不能抓住这个群体,java,regex,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()); } 为什么它在组

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

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
。为什么?

因为
group()
相当于
group(0)
,而group 0表示整个模式

从:

公共字符串组(int组)

组0表示整个模式,因此表达式
m.Group(0)
相当于
m.Group()

正如您所发现的,通过您的模式,
group(1)
为您提供了所需

如果坚持使用
group()
,则必须将模式修改为类似
”(?正如
Matcher.group()
javadoc所说,它“返回与上一个匹配匹配的输入子序列”,并且在您的情况下,上一个匹配是“USERNAME=geo”,因为您调用了
find()


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

这是因为
group
应该返回与模式完全匹配的字符串。要在该字符串中获取组,您需要传递所需的组号

有关详细信息,请参见下文:

集团

公共字符串组()
返回与上一个匹配匹配的输入子序列。

公共字符串组(整数组)
返回给定组在上一次匹配操作中捕获的输入子序列。
捕获组从左到右索引,从1开始。组0表示整个模式,因此表达式m.Group(0)等效于m.Group()

因此VAR.group(inti)将返回正则表达式的第i个捕获组。
0是完整字符串。您需要调用.group(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));
        }
    }
输出 地理位置

理由

字符串java.util.regex.Matcher.group(int) 小组)
返回输入子序列 在测试期间由给定组捕获 上一个匹配操作

对于匹配器m,输入序列s,和 组索引g,表达式 m、 组(g)和s.子串(m.启动(g), m、 端(g)是等效的


group()
并不总是返回整个字符串。我的意思是说“整个模式”。更正。事实上,根据
Matcher
javadoc:group zero始终代表整个表达式。不,这是前面的,不是完整的。您可以尝试以下操作:
Matcher m=pattern.compile(“a\\w”).Matcher(“abacad”);while(m.find())System.out.println(m.group());
--它应该打印以下几行:
ab ac ad
顺便说一句,不捕获“USERNAME=”的很酷的模式建议--非常聪明(但有点不可读)。虽然你的答案很好,但将来你可能需要像其他受访者一样详细阐述一下。“最好教一个人钓鱼等……”