当前位置: 代码迷 >> java >> java regex read属性,有什么不同的双括号
  详细解决方案

java regex read属性,有什么不同的双括号

热度:41   发布时间:2023-07-25 19:59:04.0

形式: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

我希望输出结果。 第一和第二代码中的正则表达式有什么不同?

将代码更改为。

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开始

观看这个

正则表达式中的组从0开始索引,但是正则表达式引擎自动添加组0以表示整个匹配项。 您的组索引为12

因此,您的第一次尝试几乎是正确的,您只需更改循环

for(int i = 0; i < matcher.groupCount(); i++) {

for(int i = 1; i <= matcher.groupCount(); i++) {
//          ^     ^

您可以在有关正则表达式的官方Java教程上阅读有关组的更多信息,我们可以在其中找到显示组编号方式的示例:

...捕获组是通过从左到右计数其开括号来编号的。 例如,在表达式((A)(B(C)))有四个这样的组:

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)

...
还有一个特殊的组,组0,它始终代表整个表达式。

  相关解决方案