替换
指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开
例如:0/d{2}-/d{8}|0/d{3}-/d{7}-----匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
注意:使用替换时,顺序是很重要的
例如: /d{5}-/d{4}|/d{5} 与 /d{5}|/d{5}-/d{4} 效果不同,因为匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了
分组:
如果想要重复多个字符,可以用小括号来指定子表达式(也叫做分组)
例如:(/d{1,3}/.){3}/d{1,3}---/d{1,3}匹配1到3位的数字,(/d{1,3}/.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})
后向引用
后向引用用于重复搜索前面某个分组匹配的文本。
例如:/b(/w+)/b/s+/1/b---可匹配go go,kitty kitty这样的单词,/1代表分组1匹配的文本
规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
也可以自己指定子表达式的组名,语法:(?<Word>/w+)(或者把尖括号换成'也行:(?'Word'/w+)),这样就把/w+的组名指定为Word了
/b(/w+)/b/s+/1/b可以改写为:/b(?<word>/w+)/b/s+/k<word>/b
常用分组语法:
捕获:
(exp)----匹配exp,并捕获文本到自动命名的组里
(?<name>exp)---匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)---匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言:
(?=exp)---匹配exp前面的位置
(?<=exp)---匹配exp后面的位置
(?!exp)---匹配后面跟的不是exp的位置
(?<!exp)---匹配前面不是exp的位置
注释:
(?#comment)---这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
零宽断言:
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,像/b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此它们也被称为零宽断言
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
例如:/b/+(?=ing/b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
例如:(?<=/bre)/w+/b,匹配以re开头的单词的后半部分(除了re以外的部分)
((?<=/d)/d{3})*/b,用它对1234567890进行查找时结果是234567890
今天阿去海甸岛了,竟然在大街上碰到那个林什么什么了,真是人生何处不相逢啊,她一脸不屑滴看着阿走过,阿觉得这世界有点好笑
世人笑我太疯癫,我笑世人看不穿
阿有阿滴书要看,阿有阿滴路要走,管那么多做什么