正则表达式?=,?!=,?<=或?<!最容易理解的一种思维方法
介绍这一块语法的时候有这么一句话:可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存**
这个的重写捕获是关键词,
我先假设你知道这四个的中文名称,不知道也别去查,那个看着费劲,翻译过来的,很难理解。
所以这类正则式分两步
第一步:匹配
首先别管什么正向反向肯定否定,正则式能匹配上才有第二步,假设原字符串是abcdefgh
/.(?=cde)../
在原字符串里面能不能找到包含cde,且cde前面有一个点(除换行符等的任何单个字符),而且从c开始后面有两个字符的字符串?
显然可以,根据上式,abcdefgh
中能够匹配到bcde
第二步:重写捕获
再根据正向反向,肯定否定来重写,这里只讨论肯定(即先不讨论?!和?<!)的两种情况。
首先你要记住现在你已经匹配到了bcde
/.(?=cde)../
- 这种叫正向,所以表达式
cde
前面所匹配到的字符b
不变,只需要看表达式的后面决定重写的是什么,后面是两个点,所以从c
开始由前往后读两个字符,即cd
,将其重写进中间括号匹配的结果(原本是cde),所以最终结果是bcd
(不变的d和重写的cd组成)。这里用/.(?=cde)cd/
得到的结果是一样的。 - 如果后面是四个点,则从c开始由前往后读四个,即cdef,所以最终结果是bcdef。 这里用
/.(?=cde)cdef/
得到的结果是一样的。
但是记住,后面也是要从c开始匹配,如果匹配不上,这里就会返回null,比如/.(?=cde)f/
或者/.(?=cde)d/
都是会返回null的(即不匹配)。
对于(?<=)
同样分两步,第一步同上。
/....(?<=cde)../
这个是反向查找,所以找到包含cde,且cde后面有两个字符,从e开始往前找有四个字符的字符串。
abcdefgh
中匹配到了bcdefg
第二步
这个是反向查找,所以cde
后面的两个点对应的两个字符不变,即fg
,前面有一个点,加上是反向,所以由cde
中的e从后往前读四个字符,即bcde
,所以最终结果是bcdefg
。
同样的如果前面是两个点/…(?<=cde)…/就从e开始往前读四个点,结果是defg。
举二反四,我相信这个语法就没什么难度了。