前言

记录日常工作碰到的一些正则小细节

1、group分组

需要通过()把提取的参数圈起来,这样才会产生分组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
private static String collectMapperId(String value) {
        String result = "";
        String regId = "id=\"(.*?)\"";
        Pattern pattern = Pattern.compile(regId);
        Matcher matcher = pattern.matcher(value);
        if (matcher.find()) {
            result = matcher.group(1);
        }
        return result;
    }

对比如果没有(),是没有分组效果的

1
2
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 1
	at java.util.regex.Matcher.group(Matcher.java:538)

阅读源码和源码中的注释,其实也是s.substring(m.start(g), m.end(g))

2、测试加强理解

1
2
3
4
5
6
7
8
9
public static void main(String[] args) throws Exception{
         String regEx = "count(\\d+)(df)";  
         String s = "count000dfdfsdffaaaa1";  
         Pattern pat = Pattern.compile(regEx);  
         Matcher mat = pat.matcher(s);  
         if(mat.find()){
            System.out.println(mat.group(2));
         }
     }

输出结果

1
2
3
mat.group() 输出为 count000df
mat.group(1) 输出为 000
mat.group(2) 输出为 df

如果没有括号会有异常。这就是()的作用。

1
2
3
4
5
6
7
8
9
public static void main(String []args){
     String regEx = "count\\d+";  
     String s = "count000dfdfsdff1";  
     Pattern pat = Pattern.compile(regEx);  
     Matcher mat = pat.matcher(s);  
    if(mat.find()){
        System.out.println(mat.group());
    }
}

输出结果

1
2
输出会按照"count\\d+"正则输出.
结果是 count000

…to be continue