共计 748 个字符,预计需要花费 2 分钟才能阅读完成。
反向引用
上一期讲到了反向引用,那什么是反向引用,我们先来看一个 demo
其中 1, 2 的语法就叫做反向引用,他们分别表示捕获到的第一个,第二个内容,最多可以使用到 9,表示捕获到的第 9 个内容。
注意引用的,是捕获到的内容,而不是捕获规则。所以 (\w)(\w)\1\2
表示的就是一个xyxy
的结构,因此匹配到了 "cdcd"
。
下面举几个小栗子:
- 判断字符串中有没有连续重复字符
- 缩写 16 进制颜色值
零宽断言
断言又有很多中叫法,比如环视,巡视。断言一共又分 4 种:
- x(?=y) 匹配‘x’仅仅当‘x’后面跟着‘y’. 这种叫做先行肯定断言。
- (?<=y)x 匹配‘x’仅仅当‘x’前面是‘y’. 这种叫做后行肯定断言。
- x(?!y) 仅仅当‘x’后面不跟着‘y’时匹配‘x’,这被称为正向否定断言。
- (?<!y)x 仅仅当‘x’前面不是‘y’时匹配‘x’,这被称为反向否定断言。
不同语言叫法不同,先行后行,正向反向都是一个意思。
零宽可以理解位它表示的是一个位置,而不是内容。
正则中表示位置的元字符有 \b ^ $
等等,它们也都是零宽的。
上面的两个 demo,如果不用零宽断言,则会将整个字符串给替换掉。
下面也举几个零宽断言的例子:
- 密码规则:大写,小写,数字,特殊字符必须有一个,长度 8 到 12 位
这段正则可以看到,先行断言前面的匹配项是 ^
, 几个断言分别表示,从头开始,不管中间经历了啥,始终有一个小写英文字母 / 大写英文字母 / 数字,特殊字符。
后面的 [^\s]{8,12}
表示长度 8 到 12 的非空字符。要注意的是,这里的断言,匹配的不是后面的 8 到 12 位字符,而是满足断言条件的开头^
,
- 金额千分位分隔符
正则只能从前往后匹配,这里表示如果一个数字后面跟着的数字,每三个一组,到小数点刚好分完,则需要加入分隔符。
以上就是正则的反向引用和零宽断言了,是不是很简单?
正文完