问题描述
形式:column1 = emp_no提取:键:column1值:emp_no
第一个代码:
String p1 = "column1 = emp_no";
String propertyRegexp = "^\\s*(\\w+)\\s*=\\s*(\\w+)\\s*$";
Pattern pattern = Pattern.compile(propertyRegexp);
Matcher matcher = pattern.matcher(p1);
System.out.println("groupCount: " + matcher.groupCount());
if(matcher.matches()) {
for(int i = 0; i < matcher.groupCount(); i++) {
System.out.println(i + ": " + matcher.group(i));
}
}
第一个结果:
groupCount: 2
0: column1 = emp_no
1: column1
无法找到第二个结果。 第二个括号变为双括号。
第二个代码:
String p1 = "column1 = emp_no";
String propertyRegexp = "^\\s*(\\w+)\\s*=\\s*((\\w+))\\s*$";
Pattern pattern = Pattern.compile(propertyRegexp);
Matcher matcher = pattern.matcher(p1);
System.out.println("groupCount: " + matcher.groupCount());
if(matcher.matches()) {
for(int i = 0; i < matcher.groupCount(); i++) {
System.out.println(i + ": " + matcher.group(i));
}
}
第二个结果:
groupCount: 3
0: column1 = emp_no
1: column1
2: emp_no
我希望输出结果。 第一和第二代码中的正则表达式有什么不同?
1楼
将代码更改为。
String p1 = "column1 = emp_no";
String propertyRegexp = "^\\s*(\\w+)\\s*=\\s*(\\w+)\\s*$";
Pattern pattern = Pattern.compile(propertyRegexp);
Matcher matcher = pattern.matcher(p1);
System.out.println("groupCount: " + matcher.groupCount());
if(matcher.matches()) {
for(int i = 1; i <= matcher.groupCount(); i++) { //see the changes
System.out.println(i + ": " + matcher.group(i));
}
}
第0组始终包含整个匹配的字符串。
实际组从索引1开始
观看这个
2楼
正则表达式中的组从0开始索引,但是正则表达式引擎自动添加组0以表示整个匹配项。
您的组索引为1
和2
。
因此,您的第一次尝试几乎是正确的,您只需更改循环
for(int i = 0; i < matcher.groupCount(); i++) {
至
for(int i = 1; i <= matcher.groupCount(); i++) {
// ^ ^
您可以在有关正则表达式的官方Java教程上阅读有关组的更多信息,我们可以在其中找到显示组编号方式的示例:
...捕获组是通过从左到右计数其开括号来编号的。 例如,在表达式
((A)(B(C)))
有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
...
还有一个特殊的组,组0,它始终代表整个表达式。