我正在尝试将用户名与正则表达式进行匹配。请不要建议拆分。
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
。为什么呢?
答案 0 :(得分:5)
因为group()
等同于group(0)
,而0组表示整个模式。
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))是等价的。