正则表达式是对字符串操作的一种逻辑公式,用事先规定好的一些特殊字符,以及这些字符的组合,组成一个“规则字符串”。这个“规则字符串”用来表达对字符串的一种过滤逻辑。通常被用来索引、替换、校验的操作。
一,正则表达式-元字符
正则表达式用事先规定好的一些特殊字符,以及这些字符的组合来表达字符串的一种过滤逻辑。前提咱就得先熟悉这些特殊字符(元字符)。
元字符 |
描述 |
实例 |
备注 |
^ |
1:匹配输入字符串的开始位置 2:方括号表达式中使用,此时它表示不接受该字符集合 |
|
定位符|特殊字符 |
$ |
匹配输入字符串的结束位置 |
|
定位符 |
b |
匹配一个单词边界 |
|
定位符 |
B |
匹配一个非单词边界 |
|
定位符 |
B |
标记一个子表达式的开始和结束位置 |
|
定位符 |
* |
匹配前面的子表达式零次或者多次 |
|
限定字符 |
+ |
匹配前面的子表达式一次或者多次 |
|
限定字符 |
? |
1:匹配前面的子表达式零次或者一次 2: 当该字符紧跟在任何一个其他的限制符(*、+、?、{n}、{n,}、{n,m})后面时,匹配模式是非贪婪的 |
|
限定字符 |
{n} |
匹配前面的子表达式n次 |
|
限定字符 |
{n,m} |
匹配前面的子表达式至少n次 |
|
限定字符 |
. |
匹配任意一个单字符(n排除在外) |
|
特殊字符 |
() |
标记一个子表达式的开始和结束位置 |
|
特殊字符 |
|
将下一个字符标记为一个特殊字符,或一个原义字符,或一个向后应用,或一个八进制转移字符 |
|
特殊字符 |
| |
匹配两项之间的一个选择 |
|
特殊字符 |
(parttem) |
匹配parttem并且获取这一匹配,所获取到的匹配可以从产生的Matches集合得到 |
|
特殊字符 |
(?:parttem) |
匹配parttem但是不获取匹配结果 |
|
特殊字符 |
(?=pattem) |
正向(肯定)预查(在需要匹配的字符串后面匹配parttem) |
|
特殊字符 |
(?!pattem) |
反向(否定)预查(在需要匹配的字符串后面不匹配parttem) |
|
特殊字符 |
[xyz] |
字符集合,匹配所包含的任意一个字符 |
|
特殊字符 |
[^xyz] |
负字符集合,匹配未包含的任意字符 |
|
特殊字符 |
[a-z] |
字符范围,匹配指定范围内的任意字符 |
|
特殊字符 |
[^a-z] |
负字符范围,匹配任何不在指定范围内的字符 |
|
特殊字符 |
d |
匹配一个数字字符,等价于[0-9] |
|
特殊字符 |
D |
匹配一个非数字字符,等价于[^0-9] |
|
特殊字符 |
w |
匹配包括下划线的任何单词字符,等价于[a-zA-Z0-9_] |
|
特殊字符 |
W |
匹配任何非单词字符,等价于[^a-zA-Z0-9_] |
|
特殊字符 |
xn |
匹配n,其中n为十六进制转义值,十六进制转义值必须为确定的两个数字长 |
x41 :匹配A |
特殊字符 |
num |
匹配num,其中num是一个正整数,对获取的匹配的引用 |
|
特殊字符 |
n |
标识一个八机制转义值或一个向后引用,如果n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义量 |
|
特殊字符 |
nm |
标识一个八机制转义值或一个向后引用,如果nm之前至少nm个获取的子表达式,则nm为向后引用。否则,如果n、m均为八进制数字(0-7),则nm为一个八进制转义量 |
(.)1:匹配两个连续的相同字符 |
特殊字符 |
nml |
如果n为八进制数字(0-3),且m和l均为八进制数据(0-7),则匹配八进制转义值nml |
|
特殊字符 |
un |
匹配n,其中n是一个用四个十六进制数字表示的Unicode字符 |
u00A9:匹配版权符号(?) |
特殊字符 |
cx |
匹配由x指明的控制字符 |
/cM:匹配一个Control-M或回车符 |
非打印字符 |
f |
匹配一个换页符,等价于x0c 和 cL |
|
非打印字符 |
n |
匹配一个换行符 |
|
非打印字符 |
r |
匹配一个回车符,等价于x0d 和 cM |
|
非打印字符 |
s |
匹配任何空白字符,包括空格,制表符,换页符等等,等价于[fnrtv] |
|
非打印字符 |
S |
匹配任何非空白字符,等价于[^fnrtv] |
|
非打印字符 |
t |
匹配一个制表符,等价于x09和cl |
|
非打印字符 |
v |
匹配一个垂直制表符,等价于x0b和cK |
|
非打印字符 |
二,正则表达式-运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。
运算符(高到低) |
描述 |
|
转义符 |
(),(?:),(?=),[] |
圆括号和方括号 |
*,+,?,{n},{n,},m} |
限定符 |
^,$,任何元字符、任何字符 |
定位点和序列(即:位置和顺序) |
| |
替换,”或”操作 |
三,正则表达式-分组捕获
捕获的前提是分组,正则表达式中,通过小括号来分组,小括号里面包裹的指定表达式(子串)也叫分组。捕获有两种情况:捕获组、非捕获组。
捕获组:捕获组通过从左到到右的开括号来编号。0下标始终代表整个表达式,可以认为最外层也有一层小括号,只是被隐藏了。
例如正则表达式 :(A)(B(C)) 匹配出来的捕获组有四个组:0->(A(B(C))) 、1->(A)、2->(B(C))、3->(C)。
源字符串:http://www.runoob.com:80/html/html-tutorial.html 正则表达式:(w+)://([^/:]+)(:d*)?([^# ]*)。匹配到的结果有五个分组:0(http://www.runoob.com:80/html/html-tutorial.html)、1(http)、2(www.runoob.com)、3(:80)、4(/html/html-tutorial.html)
非捕获组:以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号。
四,正则表达式-反向引用
捕获组在匹配成功时会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值,不仅可以在正则表达式外部通过程序进行引用,也可以用在正则表达式内部进行引用。这种引用就是反向引用。反向引用一定要和捕获组一起使用,用 num的方式引用, num是十进制的数字对应捕获组里面的下标。
实例一要求:查找文本中两个相同的相邻单词 正则表达式 : b([a-z]+)b b1b 解释:b([a-z]+)b 表示单词 结果:源字符串 Is is the cost of of gasoline going 匹配到一个结果of of
一个更加复杂例子分析: 源字符串:aaa bbbb ffffff 999999999 正则表达式:(w)((?=111)(1))+ 匹配结果三个:bb ffff 9999999 解释:(w)((?=111)(1))+ 先取出一个字符,判断后面是不是有三个相同的字符,有就取出一个,然后再判断后面是不是有三个相同的字符,有就取出一个。一直这么下去。得到最终结果。
五,正则表达式-预查
预查:预先判断是否是某个值。分两种情况:正向预查->预先判断是否有某个值、反向预查->预先判断没有某个值。
标题 |
正则 |
实例 |
正向(肯定)预查(在需要匹配的字符串后面匹配parttem) |
(?=pattem) |
ff(?=ab) 匹配ff,要求ff的后面必须是ab。ffab可以匹配到 |
反向(否定)预查(在需要匹配的字符串后面不匹配parttem) |
(?!pattem) |
ff(?!ab) 匹配ff,要求ff的后面不能是ab。ffa可以匹配到 |
实例要求:abcd四个字母连接,每个字母有且仅出现一次,并且顺序可以不固定(abdc,abcd,bcad等等情况)
正则表达式:([abcd])(?!1)([abcd])(?!1|2)([abcd])(?!1|2|3)([abcd])
六,正则表达式-贪婪、非贪婪
贪婪模式:尽可能多的匹配(属于贪婪模式的元字符{n,m}、{n,}、、+、?)。非贪婪:尽可能少的匹配(贪婪模式元字符后面加? {n,m}?、{n,}?、?、+?、??)。
源字符串:testabactestmmanantest 贪婪模式正则:test.*test 结果:testabactestmmanantest 贪婪模式正则:test.*?test 结果:testabactest
七,正则表达式-实例汇总
要求 |
正则表达式 |
数字 |
^[0-9]*$ |
正整数 |
^[1-9][0-9]{0,}$ |
整数 |
^-{0,1}[0-9]{1,}$ |
浮点数 |
^[-]?[0-9]+.?[0-9]+$ |
汉字 |
^[u4e00-u9fa5]{0,}$ |
由字母、数字、下划线组成的字符串 |
^[a-zA-Z0-9_]{1,}$ |
Email地址 |
^w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*$ |
日期格式 |
^d{4}-d{1,2}-d{1,2} |
备注:实例会持续收集
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|