正则表达式

正则表达式之先行断言

2020-12-20  本文已影响0人  zxiaozhang

-------正---------则----------表------------达------------式---------先-------行--------断----------言----

正则表达式还有四种断言模式非常好用灵活,分别是“:
(?=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后都会回来判断是否满足括号内的条件,按照左到右的方向看是向后走了一下。 负向后行判断也不说了,可以推出来。

上一篇 下一篇

猜你喜欢

热点阅读