1、子表达式
子表达式是一个更大的表达式的一部分,把一个表达式划分为一系列表达式的目的是为了把那些表达式当作一个独立元素来使用。子表达式必须用(和)括起来。
注意:(和)是元字符,如果需要匹配(和)本身,就必须使用它的转义序列(和) 。子表达式是可以提高可读性,对表达式的实际行为也没有任何不良影响,但对匹配操作的速度可能会有点儿影响。
hello,my name is Ben Forta,and I am the author of books on SQL ,ColdFusion,WAP,Windows 2000,and other subjects. 正则表达式 {2,} 匹配结果 无
{2,}本意是希望它能匹配 连续两次或更多次。因为{2,}紧跟着它的前一个字符,那就是也分号。
要想匹配 ,则要把 当作一个表达式。
hello,my name is Ben Forta,and I am the author of books on SQL ,ColdFusion,WAP,Windows 2000,and other subjects. 正则表达式 ( ){2,} 匹配结果
( )就是一个子表达式。( ){2,}实现匹配
pinging hog.forta.com [12.159.46.200] with 32 bytes of data; 正则表达式 d{1,3}.d{1,3}.d{1,3}.d{1,3} 匹配结果 12.159.46.200 正则表达式 (d{1,3}.){3}d{1,3} 匹配结果 12.159.46.200
(和)把表达式d{1,3}.括起来使它成为了一个子表达式,再用(d{1,3}.){3}把这个子表达式重复3次
1967-08-10 正则表达式 19|20d{2} 匹配结果 19
这个模式里|字符是正则表达式语言里的或操作符。19|20将匹配19或20
19|20d{2}应该匹配以19或20开头的4位数字,可是这个模式的匹配结果与我们预期的并不相符。因为它会把模式19|20d{2}解析成19或20d{2}
1967-08-10 正则表达式 (19|20)d{2} 匹配结果 1967
(19|20)就是一个子表达式,意思:以19或20开头的一个4位数字
2、子表达式的嵌套
子表达式允许多重嵌套,这种嵌套的层次理论上没有限制,但在实际工作中还是应该遵循适可而止的原则。
上面的IP正则表达式(d{1,3}.){3}d{1,3},从语法上讲,它完全正确。但是也能匹配不合法的iP地址。比如900.123.456.589
Ip地址由4个字节构成,iP地址每组数字取值范围也就是单个字节的表示范围,即0~255,这意味着每一组数字都不能大于255。
注意:把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并确保他们都将被排除在匹配结果以外往往要困难得多。
在构造一个正则表达式的时候,一定要把你想匹配什么和你不想匹配什么详尽的定义清楚。下面是一个合法的IP地址里的各组数字必须且只能符合的规则,我们随后根据这些规则来构造一个相应的模式。
1.任何一个1位或2位数字
2.任何一个以1开头的3位数字
3.任何一个以2开头、第二位数字在0~4之间的3位数字
4.任何一个以25开头、第3位数字在0~5之间的3位数字
(((d{1,2})|(1d{2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{2})|(2[0-4]d)|(25[0-5]))
(d{1,2})匹配范围0~99
(1d{2})匹配范围100~199
(2[0-4]d)匹配范围200~249
(25[0-5])匹配范围250~255
上面的iP正则表达式准确无误地做到了只匹配合法的IP地址、不匹配非法的IP地址。
在分析子表达式的时候,应该按照先内后外的原则来进行而不是从第一个字符开始一个字符一个字符地去尝试。而应该把表达式分解为一个个子表达式,每次只分析和理解一个子表达式。