定义
正则表达式就是用一个"字符串"来描述一个特征,然后区验证另一个"字符串"是否符合这个特征
用途
- 验证字符串是否符合指定特征,比如验证邮件地址
- 从一个长文本中查找指定字符串,使用更加灵活
- 替换指定文本
普通规则
表达式 | 作用 |
---|---|
a | 匹配单个字符a |
2 | 匹配单个字符2 |
\r, \n | 匹配回车, 换行符 |
\t | 匹配制表符 TAB |
\ | 匹配''本身 |
^ | 匹配'^'本身 |
$ | 匹配'$'本身 |
. | 匹配'.'本身 |
\d | 匹配任意一个0-9的数字 |
\w | 匹配任意一个字母或数字或下划线,也就是A-Z, a-z, 0-9, _ 中任意一个 |
\s | 匹配包括空格、制表符、换页符等空白字符的任意一个 |
. | 匹配除换行符\n以外的任意一个字符(包括数字) |
[ab5@] | 匹配'a' 或 'b' 或 '5' 或 '@'中的任意一个 |
[^abc] | 匹配'a' 'b' 'c' 之外的任意一个字符 |
[a-z] | 匹配'a' 到 'z' 的任意一个字符 |
[A-Z] | 匹配'A' 到 'Z' 的任意一个字符 |
[A-Z0-3] | 匹配'A' 到 'Z' 以及 0 到 3 的任意一个字符 |
[^A-Z0-3] | 匹配除'A' 到 'Z' 以及 0 到 3 以外的任意一个字符 |
{n} | 表达式重复n次, 比如 '\w{2}'相当于\w\w, 'a{5}'相当于aaaaa |
{m, n} | 表达式至少重复m次,最多重复n次, 比如'ba{1,3}'可以匹配'ba'或'baa'或'baaa' |
{m,} | 表达式至少重复m次,没有上限,比如'\w\d{2,}'可以匹配'a12', '_456', 'M1223'等 |
? | 表达式匹配0次或者1次,相当于{0,1},比如'a[cd]?'可以匹配'a', 'ac', 'ad' |
+ | 表达式匹配至少1次,相当于{1,},比如'a+b'可以匹配'ab', 'aab', 'aaab'等 |
* | 表达式匹配0次或任意次,相当于{0,},比如'^*b'可以匹配'b', '^b', '^^b'等 |
^ | 从字符串开始的地方匹配,不匹配任何字符, 比如'^12'可以匹配'12kp',结果为'12', 不能匹配'kp12' |
$ | 从字符串结束的地方匹配,不匹配任何字符,比如'12$'可以匹配'kp12',结果为'12',不能匹配'12kp' |
\b | 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符,即一边是属于\w,另一边不属于\w,比如:用'./b.'去匹配"abc_123中文d3=efg汉字%",结果是'3中', '文', '3=', 'g汉', 又比如用'\bto\b'去匹配'today to too'得到结果是:'to', 'today'以及'too'中的to并不能被匹配到,因为\b要求一边属于\w,另一边不属于\w,而'today'中的'd'也属于\w范围内 |
竖线 | 左右两边表达式是'或'的关系,匹配左边或者右边 |
() | (1) 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 (2) 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到 |
高级规则
- 贪婪与非贪婪
** 贪婪模式 **
在使用修饰匹配次数的特殊符号时,有多种表示方法可以使同一个表达式能够匹配不同的次数,比如: '{m,n}', '{m,}', '?', '*', '+', 具体匹配的次数随被匹配字符串而定,这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配,比如,针对文本'dxxxdxxxd',举例如下:
表达式 | 匹配结果 |
---|---|
(d)(\w+) | '\w+' 将匹配第一个'd'之后的所有字符'xxxdxxxd' |
(d)(\w+)(\d) | '\w+'将匹配第一个'd'和最后一个'd'之间的所有字符'xxxdxxx', 虽然'\w+'也能匹配上最后一个'd',但是为了使整个表达式匹配成功,'\w+'可以让出它本来能够匹配的最后一个'd' |
由此可见,'+', '*', '{m,n}'等表达式都是尽可能多的匹配,带'?'的表达式在可匹配可不匹配的时候,也是尽可能的要匹配,这种匹配原则叫做'贪婪'模式
非贪婪模式
在修饰匹配次数的特殊符号后再加上一个'?'号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的不匹配,这种匹配原则叫做'非贪婪'模式,也叫做'勉强'模式,如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功,举例如下,针对文本'dxxxdxxxd'匹配:
表达式 | 匹配结果 |
---|---|
(d)(\w+?) | '\w+?' 将尽可能少的匹配第一个'd'之后的字符,'\w+?'匹配结果是'x' |
(d)(\w+?)(\d) | 为了让整个表达式匹配成功,'\w+?'不得不匹配'xxx'才可以让后边的'd'得到匹配,从而使整个表达式匹配成功,因此,'\w+?'匹配结果是'xxx' |
- 反向引用 \1, \2……