MikeLin麦克林

导航

正则表达式Regex

挺惭愧的,学Java这么久了一直没有去学regex,所以就去学了一下(以下都是已转义为Java字符串的regex)

1. "."匹配任意字符

2. "\\d"匹配数字0-9; "\\D"可以匹配任意数字字符

3. w的意思是word,"\\w"匹配一个字母(a-z,大小写都可)、数字(0-9) 或下划线(_);"\\W"则匹配"\\w"匹配不到的字符

4. "\\s"匹配一个空格字符(blankspace或者\t都是空格字符);"\\S"则匹配"\\s"匹配不到的字符

5. 多数量匹配:"*"匹配任意个字符,包括零个字符,如"\\d*"可匹配"8", "808";"+"匹配至少一个字符,如"\\d+"可匹配"80", 不可匹配"8";"?"匹配0个或1个字符,如"\\d?"可匹配"8"和"80",无法匹配"808"

6. 如果要指定数量匹配:"{n}"匹配指定数量个字符,如"\\d{3}"可匹配"888";"{n,m}"匹配指定数量范围个字符,如"\\d{5,7}"可匹配"80808", "808080", "8080808"

7. "[...]"可以匹配范围内的字符,例如"[2-8]"可以匹配"2-8";"[...]"的排除法是"[^...]",如"[^2-8]{3}"可以匹配"019",不可以匹配"018"

8. 用^表示开头,用$表示结尾,如"^Q\\d{3}$"可以匹配"Q468"

9. "|"表示“”规则,如"learn\\s(Java|(C|c)|(P|p)ython)"可以匹配"learn Java"或“learn C”或"learn c"或"learn Python"或"learn python"

10. "()"除了能把一个子规则括起来之外,有个很重要的作用就是分组匹配。现在要把“区号-电话号码”的区号和电话号码分别提取出来:

 1 String regexImperfect = "^\\d{3,4}-\\d{7,8}$";
 2 String regexPerfect = "^(\\d{3,4})-(\\d{7,8})$";
 3 String phoneNumber = "020-61234567";
 4 Pattern pattern = Pattern.compile(regexPerfect);
 5 Matcher matcher = pattern.matcher(phoneNumber);
 6 if (matcher.matches()){
 7    String areaCode = matcher.group(1);
 8    String number = matcher.group(2);
 9    System.out.println(areaCode + "\t" + number);
10 }

(用matcher.matches()方法比直接用String.matches()方法好,因为String.matches()方法本质上就是调用matcher.matches方法,但是反复调用会创造很多个pattern对象)

 11. 正则表达式默认使用贪婪匹配,用"?"可以变成非贪婪匹配。如,我们希望"(\\d+)(0*)"匹配到"9"和"0"、"88"和"0"等,但实际上匹配到的是"90"和""、"880"和"",这是因为默认是贪婪匹配。用"?"把其变成非贪婪匹配:"(\\d+?)(0*)"就可以匹配"123"和"0"、"123"和"000"

12. String.split()方法用的参数就是regex,如果要分割用户不规范的输入,可以这样:"a, b ;; c".split("[\\,\\;\\s]+"); 如果要替换不规范的空格,可以这样:

1 String s = "The    quick\t\t brown  fox  jumps    over the  lazy dog.";
2 String r = s.replaceAll("\\s+", " ");
3 System.out.println(r);

 

posted on 2019-11-18 21:38  MikeLin麦克林  阅读(484)  评论(0编辑  收藏  举报