什么是正则表达式

  • 正则表达式是检查、匹配字符串的表达式
  • 正则表达式是描述规则,主流语言都有良好的支持
  • 字符串校验,查找与替换是正则表达式主要使用场景

注:正则表达式是检查字符串的规则,比如是不是字母开头,长度是否超过八位,是否包括大写字母等等……可以采用传统的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这个字符

javazz

正则表达式的匹配条件是两个字符都可以

如果输入的是A|C,其意思是分别匹配这两个单字符。

这里就是匹配字符串中的A和C

javazz1

正则表达式的匹配条件是一个字符集合

字符集合中的每个元素的单独匹配

如果输入[Ajd],其意思是匹配字符串中的A,j,d这三个字符

javazz2

正则表达式的匹配条件是一个字符集合,集合可以写成如0-9的范围

这个按照情况多用于0-9,a-z,A-Z这些;

javazz3

正则表达式的匹配条件的匹配条件是不希望出现某些字符

只是在[^]在中括号中多写一个^即可

下面的这个例子是,匹配出字符串中所有不是u字符的字符

javazz4

字符范围匹配的案例

(1)精准匹配”hello”或者”hallo”

通过单个字符匹配与字符集合匹配来实现精准匹配,这个用法说白了就是”字符串匹配”,即正则表达式的匹配条件是一个字符串,只是在这些字符串中有些字符没有定死

javazz5

(2)精准匹配0570-0579

通过正则表达式057[0-9]来实现用法

javazz6

(3)匹配ABCD中任意一个字符

可以使用[A-D]或者[A-D]这两个正则表达式都可以达到想要的效果

javazz7

(4)正则表达式是一个字符串的时候,是完全匹配,注意这种形式

例如正则表达式为ff的时候,这时候只会找到ff这个字符串

javazz8

正则表达式之元字符匹配

好好理解下元的含义!元可以看出是一种指代,是后续基础基础性的东西

正则表达式 说明 正确 错误
\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位的数字

javazz9

(2)匹配杭州与宁波的座机号码(0571|0574-XXXXXXXXXXXX)

正则表达式:057[1-4]-\d\d\d\d\d\d\d\d\d

javazz10

(3)匹配十八位身份证号:

身份证号码的规则是前面有17位数字,最后一个可能是数字也可能是X或者x

身份证号的第一位的范围是1234568这几个数字

可以采用正则表达式可以是:[1234568]\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d[0-9xX]

javazz11

正则表达式之多次重复匹配

{},*,+,?是一个多次重复匹配修饰符,跟在其他字符后面,用来和其他字符组合使用

正则表达式 说明 正确 错误
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]

javazz12

(2)验证短信验证码(6位数字)

使用正则表达式:\d{6}

javazz13

(3)匹配全国座机号

区号3或者4位-电话号码7或8位

javazz14

(4)匹配英文姓名

如:Gavin Wang:前面是名后面是姓,两个首字母大写,全部都是英文字母;名字多为多个英文字母,但姓有时候是可以简写为欸一个英文字母,如上面的可以简写为Gavin W

javazz15

正则表达式之定位匹配

某个字符串以什么字符开头,以什么字符结尾,需要用到定位匹配

.:小数点代表任意单个字符 *:星号代表0-无限

正则表达式 说明 正确 错误
^A.* 头匹配 ABC…… CBA……
.*A$ 尾匹配 CB……A AB……C
^A.*A$ 全字匹配 ACCC……A ACCC……B

定位匹配的案例

默认的正则表达式是在原始字符串中依次查找;;找到了以后符合的子字符串,会继续查找,所以下面查找到4个子字符串ab

javazz16

如果只输出^ab.*,这里只会匹配到开头的ab后面的字符就是./匹配到的内容

javazz17

有的场景是需要限制字符数量

如:[a-z]{3}ab$:匹配[a-z]的字符三次,最后以ab结尾的字符串

javazz18

在实际工作中,头尾同时匹配也很常见

^ab.*ab$:以ab开头与结尾,中间匹配任意字符

javazz19

正则表达式之贪婪模式&非贪婪模式

贪婪模式

  • 在满足条件的情况下尽可能多匹配到字符串
  • 示例:111222333 正则:\d{6,9}
  • 贪婪模式下会尽可能地多匹配,所以会匹配9个

非贪婪模式

  • 在满足条件地情况下尽可能减少匹配到地字符串,在正则表达式后增加?,则代表采用非贪婪模式
  • 示例:111222333 正则:\d{6,9}?
  • 非贪婪模式会尽可能少匹配,所以会匹配6个

示例

1
<a href="www.baidu.com">百度</a><a href="www.sina.com">新浪</a>

要求是提取出其中地网址

正则表达式:”.*”,其意为” “中地任意字符匹配,这种写法是贪婪模式

会将中间地””也匹配出来

javazz20

将正则表达式后增加?,更改为非贪婪模式,就会得到我们想要地结果

javazz21

正则表达式之表达式分组

将一个完整地正则表达式分组为多个子表达式的使用方法;利用表达式分组可以将一个大的表达式进行拆分

  • 分组将正则分组为多个子表达式
  • 示例:abababcdcdcd
  • 正则表达式:(ab){3}(cd){3}

可以发现,通过表达式分组可以组合成更加复杂的[正则表达式的字符串],从而可以匹配出更加复杂的字符串;同时表达式分组也可以让正则表达式更加清晰,可读性更高

表达式分组的案例

(1)匹配验证码

这个例子主要体现:表达式分组和|符号的组合使用

正则表达式:^\d{4}$|^\d{6}$其意为开头为数字且结尾也是数字的字符串,|的意思是|两边二选一,所以这可以匹配4位验证码或者6位验证码

javazz22

javaz23

(2)匹配车牌号

这个例子主要体现:表达式分组可以让正则表达式更加清晰;

车牌号规范是:一个汉字,一个大写字母,一个横杠 ;然后有5个字母和数字的组合;

可以采用:^([[鲁黑晋豫]][A-Z][A-Z])-([A-Z0-9]{5})$,这样写将前面匹配的,与后面匹配的字符串分隔开来可读性高

javazz24

(3)匹配中文或英文名字

这个例子主要体现:表达式分组可以应对更加复杂的情况

英文姓名:

javazz25

匹配中文可以采用\u4e00-\u9afa5:Unicode编码中文汉字编码区间,可以判断是不是中文

javazz26

将匹配中文和英文利用|符号,这样就可以判断中文或者英文

javazz27

javazz28