定义及用途
正则表达式是描述字符串集的字符串。主要用于以下几个方面:
a 验证字符串是否和正则表达式匹配
b 在字符串中查找满足正则表达式的子串
c 替换满足正则表达式的子串为其他
正则表达式基本语法
a 常量字符
字母,数字,下划线以及没有特殊定义的符号都称之为常量字符。表达式中的常量字符,在匹配一个字符串中,匹配与之相同的一个字符串。
例如:正则表达式bcd与目标字符串abcde,则匹配成功,匹配内容是:bcd
b 元字符
限定符 | 描述 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母,数字或者下划线的单词字符 |
\W | 匹配任何非单词字符 |
\s | 匹配任意空白符,包括空格,制表,换页符等 |
\S | 匹配任意非空白字符 |
\d | 匹配任意一个数字 |
\D | 匹配任意一个非数字 |
c 位置锚定元字符
锚定符 | 描述 |
^ | 待匹配的字符位于行首 |
$ | 待匹配字符位于行尾 |
\b | 匹配单词的开始或结束,即单词边界位置 |
\B | 匹配单词的非边界位置 |
d 转义字符
如果你想要得到元字符本身的话需要使用“\”来取消这些元字符的特殊意义
e 字符集
使用[]方括号包含一系列字符,能够匹配其中任意一个字符。另外,可以使用“-”表示范围内的所有字符。例如:[a-z12]表示匹配所有小写字母以及数字1,2中任何一个
使用[^]包含一系列字符,则匹配其中字符之外的任意一个字符
f 重复限定
语法 | 说明 |
? | 重复0次或者1次 |
* | 重复0次或者多次 |
+ | 重复一次或者多次 |
{n} | 重复n次 |
{n,} | 重复至少n次 |
{n,m} | 重复至少n次,但不多于m次 |
正则表达式高级规则
a 贪婪重复匹配模式
在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数。默认总是尽可能多的匹配,对于字符串“dxxxdxxxd”,举例如下:
(d)(\w+) | “\w+”将匹配第一个“d”之后的所有字符“xxxdxxxd” |
(d)(\w+)(d) | “\w+”将匹配第一个“d”和最后一个“d”之间所有字符,虽然“\w+”也能够匹配上最后一个“d”,但为了使整个表达式能够匹配成功,“\w+”可以“让出”它本来能够匹配的最后一个“d” |
b 非贪婪重复匹配模式
在修饰匹配次数的特殊符号后再加一个“?”号,则可以使匹配次数不定的表达式尽可能少的匹配,也称之为“勉强模式”。针对文本“dxxxdxxxd”
(d)(\w+?) | “\w+?”将尽可能少的匹配“d”后面的字符,结果就是“\w+?”只匹配了一个“x” |
(d)(\w+?)(d) | 为了让整个表达式匹配,“\w+?”不得不匹配“xxx”,才可以让后边的“d”匹配,从而使得整个表达式匹配成功,因此,结果是“\w+?”匹配第一个“d”和第二个“d”之间的“xxx” |
c 反向引用
表达式在匹配时,表达式引擎会将小括号“()”包含的表达式锁匹配到的字符串记录下来,在获取匹配结果时,小括号包含的表达式所匹配到的字符串可以单独获取。在实际场合中,当用某种边界来查找,而所获得的内容又不包含边界时,必须使用小括号来指定所要的范围。例如“<html>(.*?)</html>”表达式,可以在匹配后单独把(.*?)匹配的内容提取出来。
其实“小括号包含的表达式所匹配到的字符串”不仅可以在匹配结束后可以使用,在匹配过程中也可以使用。引用方法是”\“加上一个数字。”\1“引用第1个括号内匹配到的字符串。比如,正则表达式”<(\w+)>.*?</\1>“中的”\1“表示该处匹配第一个”<>“中内容,该表达式可以用来校验<html>aa</html>等html标记是否配对,注意中间”.*?“是非贪婪模式
d 正向预搜索与反向预搜索
正向匹配 (?=xxx),正则表达式”windows (?=NT|XP)“在匹配”windows 98, windows NT, windows 2000“时,将只匹配”windows NT“中的”windows“,其他的”windows“匹配不上。
正向不匹配(?!xxx),正则表达式”do(?!\w)”在匹配字符串”done,do,dog“,只匹配”do“。
反向预搜索: 匹配(?<=xxx) 不匹配(?<!xxx)