正则表达式?=,?!=,?<=或?<!最容易理解的一种思维方法
介绍这一块语法的时候有这么一句话:可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存**
这个的重写捕获是关键词,
我先假设你知道这四个的中文名称,不知道也别去查,那个看着费劲,翻译过来的,很难理解。
所以这类正则式分两步
第一步:匹配
首先别管什么正向反向肯定否定,正则式能匹配上才有第二步,假设原字符串是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。
举二反四,我相信这个语法就没什么难度了。
本文深入解析正则表达式中的前瞻(?=)、否定前瞻(?!?)、回溯(?<=)及否定回溯(?<!)的使用方法。通过实例说明如何利用这些特性进行高效精确的字符串匹配与捕获,特别强调了重写捕获的概念及其应用。
1295

被折叠的 条评论
为什么被折叠?



