正则表达式
什么是正则表达式
- 正则表达式是检查、匹配字符串的表达式
- 正则表达式是描述规则,主流语言都有良好的支持
- 字符串校验,查找与替换是正则表达式主要使用场景
注:正则表达式是检查字符串的规则,比如是不是字母开头,长度是否超过八位,是否包括大写字母等等……可以采用传统的Java代码(或JavaScript代码),来进行挨个判断处理,但会很低效,为了解决这类问题,正则表达式是一个很好的工具,Java提供了对正则表达式这个工具的支持
正则表达式的案例
- 检查输入的身份证号码是否合法(15位,18位)
- 示例:13010220200328091x
- 正则表达式(^\d{15}$)|(^\d{18}$)|(^\d{17}$)|(^\d{X}$)
正则表达式之字符范围匹配
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
A | 精准匹配单个字符 | A | a |
x|y | 允许出现的2个字符 | y | n |
[xyz] | 字符集合,允许出现集合内任意单个字符 | z | c |
[a-z],[A-Z],[0-9] | 字符范围 | a,D,8 | A,a,A |
[^xyz],[^0-9 | 集合内字符不允许出现 | 0,A | y,8 |
注:
(1)正则表达式规定了匹配条件;
(2)会根据正则表达式定义的匹配条件,逐个字符的检验原字符串的字符,符合匹配条件的字符就匹配出来,不符合匹配条件的字符就匹配不出来;
(3)https://tool.oschina.net/regex:开源中国提供的正则表达式测试工具,可以用来测试正则表达式
正则表达式的匹配条件是单个字符
单次匹配的结果也是单个字符,自然一个包含多个字符的字符串可以匹配成功多次
输入A,其意思是在字符串中找出A这个字符
正则表达式的匹配条件是两个字符都可以
如果输入的是A|C,其意思是分别匹配这两个单字符。
这里就是匹配字符串中的A和C
正则表达式的匹配条件是一个字符集合
字符集合中的每个元素的单独匹配
如果输入[Ajd],其意思是匹配字符串中的A,j,d这三个字符
正则表达式的匹配条件是一个字符集合,集合可以写成如0-9的范围
这个按照情况多用于0-9,a-z,A-Z这些;
正则表达式的匹配条件的匹配条件是不希望出现某些字符
只是在[^]在中括号中多写一个^即可
下面的这个例子是,匹配出字符串中所有不是u字符的字符
字符范围匹配的案例
(1)精准匹配”hello”或者”hallo”
通过单个字符匹配与字符集合匹配来实现精准匹配,这个用法说白了就是”字符串匹配”,即正则表达式的匹配条件是一个字符串,只是在这些字符串中有些字符没有定死
(2)精准匹配0570-0579
通过正则表达式057[0-9]来实现用法
(3)匹配ABCD中任意一个字符
可以使用[A-D]或者[A-D]这两个正则表达式都可以达到想要的效果
(4)正则表达式是一个字符串的时候,是完全匹配,注意这种形式
例如正则表达式为ff的时候,这时候只会找到ff这个字符串
正则表达式之元字符匹配
好好理解下元的含义!元可以看出是一种指代,是后续基础基础性的东西
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
\d | 匹配任意单个数字 | 8 | i |
\D | 匹配\d规则之外的任意单个字符 | i | 8 |
\w | 匹配任意单个字母,数字,下划线 | Y | & |
\W | 匹配\w之外的任意单个字符 | & | Y |
\s | 匹配单个空格 | x | |
\n | 匹配单个换行符 | \r\n | x |
. | 匹配任意单个字符(换行符除外) | _ | \r\n |
\. | 特殊字符,只匹配. | . | 1 |
元字符范围匹配的案例
下面的几个例子,正则表达式的匹配条件都是字符串,只是这些字符串的某些字符可能是没有定死而已,而是使用了元字符去指代;自然,如果正则表达式的匹配条件是字符串的话,其匹配条件是字符串的话,其匹配结果也会是字符串,这种字符串形式应该是现在最常用的形式
(1)匹配四位整数六位小数的一个数字,如3467.798789:
\d\d\d\d.\d\d\d\d\d\d其意思为匹配字符串中的前四位的数字然后匹配小数点,最后匹配小数点后面的6位的数字
(2)匹配杭州与宁波的座机号码(0571|0574-XXXXXXXXXXXX)
正则表达式:057[1-4]-\d\d\d\d\d\d\d\d\d
(3)匹配十八位身份证号:
身份证号码的规则是前面有17位数字,最后一个可能是数字也可能是X或者x
身份证号的第一位的范围是1234568这几个数字
可以采用正则表达式可以是:[1234568]\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d[0-9xX]
正则表达式之多次重复匹配
{},*,+,?是一个多次重复匹配修饰符,跟在其他字符后面,用来和其他字符组合使用
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
A{N} | 精准匹配N次匹配 | AAA…… | AA |
A{N,} | 最少出现N次 | AAA…… | AA |
\d{N,N+n} | 约定出现的最少次数与最大次数 | 1234 | 12 |
\d* | 可以出现零次至无限次,相当于{0,} | 1234 | 12 |
\d+ | 最少出现一次,相当于{1,} | 12 | |
\d? | 最多出现一次,相当于{0,1} | 1 | 12 |
多次重复匹配的案例
(1)匹配十八位身份证号
同样是上面案例中的身份证号的匹配也可以使用:[1234568]\d{16}[0-9Xx]
(2)验证短信验证码(6位数字)
使用正则表达式:\d{6}
(3)匹配全国座机号
区号3或者4位-电话号码7或8位
(4)匹配英文姓名
如:Gavin Wang:前面是名后面是姓,两个首字母大写,全部都是英文字母;名字多为多个英文字母,但姓有时候是可以简写为欸一个英文字母,如上面的可以简写为Gavin W
正则表达式之定位匹配
某个字符串以什么字符开头,以什么字符结尾,需要用到定位匹配
.:小数点代表任意单个字符 *:星号代表0-无限
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
^A.* | 头匹配 | ABC…… | CBA…… |
.*A$ | 尾匹配 | CB……A | AB……C |
^A.*A$ | 全字匹配 | ACCC……A | ACCC……B |
定位匹配的案例
默认的正则表达式是在原始字符串中依次查找;;找到了以后符合的子字符串,会继续查找,所以下面查找到4个子字符串ab
如果只输出^ab.*,这里只会匹配到开头的ab后面的字符就是./匹配到的内容
有的场景是需要限制字符数量
如:[a-z]{3}ab$:匹配[a-z]的字符三次,最后以ab结尾的字符串
在实际工作中,头尾同时匹配也很常见
^ab.*ab$:以ab开头与结尾,中间匹配任意字符
正则表达式之贪婪模式&非贪婪模式
贪婪模式
- 在满足条件的情况下尽可能多匹配到字符串
- 示例:111222333 正则:\d{6,9}
- 贪婪模式下会尽可能地多匹配,所以会匹配9个
非贪婪模式
- 在满足条件地情况下尽可能减少匹配到地字符串,在正则表达式后增加?,则代表采用非贪婪模式
- 示例:111222333 正则:\d{6,9}?
- 非贪婪模式会尽可能少匹配,所以会匹配6个
示例
1 | <a href="www.baidu.com">百度</a><a href="www.sina.com">新浪</a> |
要求是提取出其中地网址
正则表达式:”.*”,其意为” “中地任意字符匹配,这种写法是贪婪模式
会将中间地””也匹配出来
将正则表达式后增加?,更改为非贪婪模式,就会得到我们想要地结果
正则表达式之表达式分组
将一个完整地正则表达式分组为多个子表达式的使用方法;利用表达式分组可以将一个大的表达式进行拆分
- 分组将正则分组为多个子表达式
- 示例:abababcdcdcd
- 正则表达式:(ab){3}(cd){3}
可以发现,通过表达式分组可以组合成更加复杂的[正则表达式的字符串],从而可以匹配出更加复杂的字符串;同时表达式分组也可以让正则表达式更加清晰,可读性更高
表达式分组的案例
(1)匹配验证码
这个例子主要体现:表达式分组和|符号的组合使用
正则表达式:^\d{4}$|^\d{6}$其意为开头为数字且结尾也是数字的字符串,|的意思是|两边二选一,所以这可以匹配4位验证码或者6位验证码
(2)匹配车牌号
这个例子主要体现:表达式分组可以让正则表达式更加清晰;
车牌号规范是:一个汉字,一个大写字母,一个横杠 ;然后有5个字母和数字的组合;
可以采用:^([[鲁黑晋豫]][A-Z][A-Z])-([A-Z0-9]{5})$,这样写将前面匹配的,与后面匹配的字符串分隔开来可读性高
(3)匹配中文或英文名字
这个例子主要体现:表达式分组可以应对更加复杂的情况
英文姓名:
匹配中文可以采用\u4e00-\u9afa5:Unicode编码中文汉字编码区间,可以判断是不是中文
将匹配中文和英文利用|符号,这样就可以判断中文或者英文