-------正---------则----------表------------达------------式---------先-------行--------断----------言----
正则表达式还有四种断言模式非常好用灵活,分别是“:
(?=pattern) 零宽正向先行断言
(?!pattern) 零宽负向先行断言
(?<=pattern) 零宽正向后行断言
(?<!pattern) 零宽负向后行断言
首先解释一下零宽是什么意思? 当然是没有宽度的意思了,这种问题还用问,我简直就是我这一届见过最差的学生。 类似^ 和 匹配行的结束位置\b匹配必须出现在单词的开头位置前或后至少有一个空格(?=pattern)匹配位置后面必须紧跟pattern字符的【正向先行断言】(?!pattern)匹配位置后必须不能跟pattern字符的【负向先行断言】(?<=pattern)【正向后行断言】匹配位置前面必须是pattern字符的 【js中不支持】(?<!pattern)【负向后行断言】匹配位置前面必须不是pattern字符的 【js中不支持】
我们先来看下这个零宽正向先行断言
其实很简单的一个场景就可以说明白了:
下面四个例子中我们要匹配字符串都是 hai xiaozhang, do you remeber zhe picture ?
如果我们要找其中的remeber中的re 而不是picture 中的re的时候该怎么做捏? 就是用正向先行断言 ,表达式为 re(?=meber) 这样表达式就限定了re后边紧跟的必须是meber 。回看正向先行断言即为:代表字符串中的一个位置,紧挨该位置的字符必须是xxxx(等号后面的pattern)。
因为这个都是零宽的不占位置所以其实它匹配的是上例中的e和m 之间的位置,那么如果 我们把正则改为 re(?=meber). 这里跟个点号会有什么结果呢? 因为点号匹配除换行以外的任何字符所以得到的结果是 rem 可以看出括号里面的内容匹配的是em之间的字符。
现在我们来看零宽负向先行断言
这个跟上面的正好相反,就是匹配位置后紧跟的一定不能是xxx (pattern);
表达式改为 re(?!meber) 那么这个就会匹配到picture中的re
再来我们看下接下来的后行断言
js 语言中正则表达式仅支持先行断言哦,所以后行不再以栗子讲解,只是说下大概,其实就是反过来,比如判断re前面必须是pictu 那么就可以写成(?<=pictu)re 这个在js代码中无效。为什么叫后行,可以理解为正常的代码都是从左到右匹配的,这个匹配到re后都会回来判断是否满足括号内的条件,按照左到右的方向看是向后走了一下。 负向后行判断也不说了,可以推出来。