相信大家在看正则表达式语法的时候都会遇到下面几种:正向肯定,正向否定,反向肯定,反向否定

1、(?=pattern)

正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。

这是一个非获取匹配,该匹配不需要获取供以后使用。

例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,

但不能匹配“Windows3.1”中的“Windows”。

预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,

而不是从包含预查的字符之后开始。

 

2、(?!pattern)

正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。

这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,

但不能匹配“Windows2000”中的“Windows”。

 

3、(?<=pattern)

反向肯定预查,与正向肯定预查类似,只是方向相反。

例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,

但不能匹配“3.1Windows”中的“Windows”。

 

4、(?<!pattern)

反向否定预查,与正向否定预查类似,只是方向相反。

例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,

但不能匹配“2000Windows”中的“Windows”。

 

我第一次看的时候就觉得很难理解,读了两遍好不容易理解了,但是一直用不上,直到工作需要...............

str = "111/;hkakdhaldladhl;gddhkshls;hhhh"
用 ; 切割字符串,要求切割结果是111/;hkakdhaldladhl        gddhkshls        hhhh,也就是第一个;前面有/,所以第一个;不分割,只分割后面的;

这其实就用到了反向否定,将python里面的split函数和正则表达式完美结合在一起,大家根据我的例子再去理解正(反)向否(肯)定匹配,肯定就更清晰了
python代码实现:

import re

str = "111/;hkakdhaldladhl;gddhkshls;hhhh"
str_list = re.split(r"(?<!\/);",str)
print(str_list)

结果:

java 正则表达式 正向预查 负向预查 正则反向匹配_字符串

注:?<! 是反向否定的意思, \/  是对  /  做了转义

 

为了能记得住,我总结了下面的规律,供参考~~

"肯定" 就是出现在?<!    ?<=    ?!   ?= 后面那些字符,我们要匹配的字符串这个才去匹配

"否定"就是出现在?<!    ?<=    ?!   ?= 后面那些字符,我们要匹配的字符串不这个才去匹配

"正反向"就是例子里面windows在 ?<!    ?<=    ?!   ?= 以及后面字符的前面还是后面,windows在后是反向,在前是正向

记起来就是,四种都要带? 肯定的是=   否定的是!     如果是反向就加上<