Java 正则匹配 :基础规则

61 阅读3分钟

今天遇到一个关于15位、18位身份证号的事情,遂去了解了一下java有关正则匹配的相关内容。

基本正则规则:

基础元字符:

普通字符

直接匹配字符本身

正则对应内容
abc"abc"

转义字符

\转义特殊字符,匹配其字面值。

正则对应内容
\*.txt*.txt(不是通配)

字符类

[ ]内部匹配任意一个字符

正则对应内容
[aeiou]匹配任意元音如"u"

排除字符类

[^ ]匹配不在括号内的字符

正则对应内容
[^aeiou]匹配任意辅音如"p"

范围

- 表示字符范围。

正则对应内容
[0-9]匹配任意数字如"1"
[A-Z]匹配任意大写字母如"A"
[一-龟]常用汉字的正则

其他有关汉字的[:(18 封私信) 匹配汉字的正则表达式写法总结及范围比较 - 知乎]

量词

精确次数

{n}匹配n次

正则对应内容
[0-9]{3}匹配任意三位数字如"123"

范围次数

{n,m}匹配 n 到 m 次。注意该模式默认为贪婪模式,如果需要非贪婪模式需要加‘?’

正则对应内容
[0-9]{1,3}匹配"12345"会匹配到"123"
[0-9]{1,3}?匹配"12345"会匹配到"1"

至少一次

+ 匹配一次或多次(注意这个也是贪婪的)

正则对应内容
[0-9]+匹配尽可能多的数字

0次或一次

? 匹配 0 次或 1 次。

正则对应内容
colou?rcolor或colour

零次或多次

* 匹配0或多次

正则对应内容
\s*0个或多个空白

边界匹配

字符串开头

^ 字符串开头

正则对应内容
^HelloHello开头的字符串

字符串结尾

$匹配字符串结束位置。

正则对应内容
worldworld结尾的字符串

单词边界

\b 匹配单词边界(如空格、标点)。

正则对应内容
\bcat\b独立单词cat,不是 Tomcat 或者 category
\bcat\w*匹配以 cat 开头的独立单词如cat或者category
\b\d+\b独立数字如123,而非46.78

非单词边界

\B匹配非单词边界(即不包含独立单词)。

正则对应内容
\Bcat非独立单词里含cat,如"category"
\Bcat\B只有前后均为字母才可以匹配的到,如"concatenate"
\B-\B如"high-quality"里面的-

分组与引用

捕获分组

( ) 将括号内内容视为一个整体,并捕获匹配结果。

正则对应内容
(\d{3})-(\d{4})匹配 123-4567,并捕获 123 和 4567

非捕获分组

(?: ) 分组但不捕获内容。

正则对应内容
(?:\d{3})-\d{4}仅匹配模式,不捕获分组

反向引用

\n 引用第 n 个捕获分组的内容。

正则对应内容
^(\w)(\w)\2\1$对称字符串,如:abba

预查(断言)

正向预查

(?= ) 匹配后面紧跟指定模式的位置。

正则对应内容
\d+(?=px)匹配 12px 中的 12

负向预查

(?! ) 匹配后面不紧跟指定模式的位置。

正则对应内容
\d+(?!px)匹配不以 px 结尾的数字。

正向回顾后发

(?<= ) 匹配前面是指定模式的位置。

正则对应内容
(?<=$)\d+匹配 $123 中的 123

负向回顾后发

(?<! ) 匹配前面不是指定模式的位置。

正则对应内容
(?<!$)\d+匹配不以 $ 开头的数字。

常用简写字符类

正则简写等价描述
\d[0-9]数字
\D[^0-9]非数字
\w[A-Za-z0-9_]单词字符(字母、数字、下划线)
\W[^A-Za-z0-9_]非单词字符
\s[\t\n\r\f]空白字符
\S[^\t\n\r\f]非空白字符

简述 Pattern 与 Matcher

从实用角度出发,Pattern用于规定正则规则,matcher用于比较

例如 18位身份证匹配:

/**
 * 18位身份证
 */
private final static Pattern ID_NO_18 = Pattern.compile("[0-9]{6}[0-9]{4}[0,1][0-9][0-3][0-9][0-9]{3}[0-9X]");
/**
* 判断是否为18位身份证
*/
public boolean is18Id(String idNo) {
    String a = idNo.trim();
    return ID_NO_18.matcher(a).matches();
}