今天遇到一个关于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?r | color或colour |
零次或多次
* 匹配0或多次
| 正则 | 对应内容 |
|---|---|
| \s* | 0个或多个空白 |
边界匹配
字符串开头
^ 字符串开头
| 正则 | 对应内容 |
|---|---|
| ^Hello | Hello开头的字符串 |
字符串结尾
$匹配字符串结束位置。
| 正则 | 对应内容 |
|---|---|
| world | world结尾的字符串 |
单词边界
\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();
}