正则表达式
Regex Expression
本文会对正则表达式进行全面的总结和解析,可以做为入门资料和参考书
一.初级语法与解析
1. 常用字符类
语法 | 解析 | 例子 |
/d | 任何一个0-9的数字 | 0,6,5,4,8,9 |
/D | 任何一个非数字字符 | @, a, f, “, * |
/w | 任何一个单词字符,数字和字母 | A, d, g, 5, 0, 8 |
/W | 任何一个非单词字符 | @, ^, ( |
/s | 任何一个空白字符 | 空格,TAB符,换行符 |
/S | 非空白字符 | A,%,5 |
. | 任意一个字符 | 》,a,5, *, , |
[…] | 包含在括号中的字符 | [abc] -----abc, [a-z] -----a,d,f,z |
[^…] | 只要不是在括号的字符 | [abc]-----d,f,e,g,h,#,4 |
2.字符位置类
语法 | 解析 | 例子 |
^ | 其后的模式必须在字符串的开始处,或者是任一行的开始处(当出来多行匹配时) | ^/d=====1ddd !=====dddd |
$ | 其前的模式必须在字符串的结尾处,或者是任一行的结尾处(当出来多行匹配时) | 与上面的相反 |
/A | 前面的模式必须在字符串的开始处,多行模式将被忽略 |
|
/z | 前面的模式必须在字符串的结尾处,多行模式将被忽略 |
|
/Z | 前面的模式必须在字符串的末尾处,或是换行符前 |
|
/b | 位于一个单词的开始,匹配一个单词的边界 |
|
/B | 匹配一个单词非边界,不是一个单词的开始 |
|
3.字符重复符
语法 | 解析 | 例子 |
{n} | 前面模式将匹配n次 | d{5}=====ddddd |
{n,} | 前面模式至少匹配n次 | d{2,}=====dd,dddd,ddddd d{2,}!=====d |
{n,m} | 前面模式匹配的次数在n—m之间 ,n可以为0,包含nm | a{2,4}=====aa,aaa,aaaa |
? | 前面的模式匹配0次或1次 | da?===da,d |
+ | 前面的模式匹配1-无数次 | Da+====Da ,Daaa,Daaaaaa |
* | 前面的模式匹配0或无数次 | Fe*====F,Fe,Feeeeeee |
4.转义序列
转义符 | 解析 |
// | 相当于字符 / |
/^ | 相当于字符 ^ |
/* | 相当于字符 * |
/. | 相当于字符 . |
/+ | 相当于字符 + |
/? | 相当于字符 ? |
/( | 相当于字符 ( |
/) | 相当于字符 ) |
/} | 相当于字符 } |
/{ | 相当于字符 { |
/| | 相当于字符 | |
/n | 换行符 |
/t | TAB符 |
/v | 垂直制表符 |
/r | 回车符 |
/f | 换页符 |
/nnn | 匹配一个三位的八进制ASCII值 |
/unn | 匹配一个两位的十六进制 ASCII值 |
/xnnn | 匹配一个4位的十六进制数的Unicode字符 |
/cV | 匹配一个控制字符 /cV===CTRL+V |
5.其他标志(JS)
i | 忽略大小写 |
M | 多行标志 |
G | 全局匹配 |
二.高级语法与解析
1. 分组
捕获: ( )
在此括号内的模式被组合成一个捕获组,它所包含的模式所匹配的字符将会被包含到最终的匹配结果中.
如:
([a-z]{3})/d
它匹配: sss1,ddd2,ggg3, 其中的sss,ddd,ggg就分别是一个捕获组.
非捕获: (?:)
在此括号内的模式不会被组合成一个捕获组,但是它所包含的模式所匹配的字符将会被包含到最终的匹配结果中.
2. 决策: |
,它代表如果此符号前面的模式不能够找到匹配的字符则用此符号后面的模式来寻找匹配.如果前面的模式已经找到了,后面将会被忽略!
如:[a-z] | [A-Z]
则, a 可以匹配,A也可以匹配此模式.
3.声明
正声明: (?=)
它规定了在括号中声明的模式必须出现在声明的右侧,声明将不会包含在终于匹配的结果中.
如:
REGEX: (?=/.net)
字符串: There are ASP.net c.net, Jscript.net !
上面的匹配结果为:
ASP
c
Jscript
负声明: (?!)
它规定了在括号中声明的模式不能紧贴在声明的右侧,声明将不会包含在终于匹配的结果中.
就是说寻找在括号内模式左边符合条件的字符.
REGEX: /d{3,}(?![A-Z])
字符串: 111A 444c 555 4444E
上面匹配结果是:
444
555
反向正声明: (?<=)
它规定了在括号中声明的模式必须出现在声明的左侧,声明将不会包含在终于匹配的结果中.
就是说寻找在括号内模式右边符合条件的字符.
如:
REGEX: (?<=/New)[A-Z][a-z]+
字符串: New Zland China Town New York
上面匹配结果为:
Zlang York
非回溯: (?>)
它防止了REGEX引擎为了匹配成功而进行回溯,被成为贪婪的子表达式.
REGEX默认是回溯的.
如
REGEX: .*ing
将会匹配所有后面带ing的字符串,但是如果加上(?>.*)ing就不行了!