我的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=”的很酷的模式建议--非常聪明(但有点不可读)。虽然你的答案很好,但将来你可能需要像其他受访者一样详细阐述一下。“最好教一个人钓鱼等……”