上一篇写了单个正则表达式字符的使用,现在讲讲正则表达式字符的组合使用,重复字符串,可以用小括号来指定子表达式(分组),然后指定重复的次数就行了。
比如ip地址,它是一个以点号分割,分割出四组数字,每组数字都是0到255的规律字符串,所以我们需要分组的写法,(\b{1,3}.){3}\d{1,3} 是一个简单的IP地址匹配表达式。\b{1,3}代表1到3位的数字,(\b{1,3}.){3} 表示1到3位再加一个. 重复3次(因为只有3个点),\d{1,3} 然后后面再加上一个1到3位的数字,这样就可以满足以点号分割,分割出四组数字的条件了。
但是,这样正则表达式虽然可以匹配正确的ip地址,还可以匹配到错误的iP地址(比如比255大数字,ip地址每组数字范围是0~255)
所以正确的写法应该是这样:((2[0-4]\b|25[0-5]|[01]?\d{1,2}).){3}(2[0-4]\d|25[0-5] |[01]?\d{1,2}) 。2[0-4]\b代表200~249 ,25[0-5] 代表250255,[01]?\d{1,2}代表0199,
[01]? 代表0或者1 (01和001也可以匹配到) d{1,2}代表匹配一位或两位数,所以合起来就可以匹配到0~199了,然后把(\b{1,3}.){3}\d{1,3}和2[0-4]\b|25[0-5]|[01]?\d{1,2}合起来就等到正确的ip地址表达式了。
后向引用:
使用小括号指定一个子表达式后,可以在表达式或其他程序中作进一 步处理。。默认情况下,每个分组会自动拥有一个组号,从左向右,第一个分组为1,第二个为2,以此类推。
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1 代表分组1匹配的文本。
比如想获取到连续两个重复的字母:
你也可以给前面的分组取个名字,然后后面向引用这个分组 捕获 的内容,就可以了。
取名写法:(?exp),引用写法:\k,比如上面的([a-z])\1和(?[a-z])\k等价,匹配的也是连续两个重复的字母。PS: (?:exp) 为不捕获文本
注意!([a-z])\1和([a-z]){2}不等价!
([a-z]){2}意思是两个连续出现的字母,它不管这两个字母是否一样。
零宽断言:
(?=exp) 零宽先行断言,匹配exp前面的位置
(?<=exp) 零宽后行断言,匹配exp后面的位置
比如我想匹配,/Document/Notice/Image/之后 “style=之前的字符串,我们可以使用零宽先行断言和零宽后行断言把它指定出来。
替换:
替换就是将表达式匹配到的字符串替换为指定字符串,可以使用 $1、
2
等
来
引
用
对
应
分
组
的
值
,
将
之
前
的
替
换
掉
,
2 等来引用对应分组的值,将之前的替换掉,
2等来引用对应分组的值,将之前的替换掉,后面的引用和之前后项引用差不多,但$后面不能用引用名称,只能用序号。
比如,我想将aa替换成+a,匹配连续出现的字母并将第一个字母替换为+,第二个字母不变:
注释:
(?#注释) 这类型的组不对正则表达式的处理产生任何影响,只是阅读注释。
例: ([a-z])\1(?#捕获连续两个重复的字母)