对正则表达式零宽断言的个人理解(Java测试下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l707268743/article/details/53081418

零宽断言主要有4种形式:正预测零宽断言(?=),负预测零宽断言(?!),正回顾零宽断言(?<=),负回顾零宽断言(?<!)(翻译可能不准确)

可以看出主要分为正向负向和预测回顾的各种组合
所谓正向,指的是匹配表达式,负向则指不匹配(他们最主要的区别就是=和!)
所谓预测指的是要匹配的后面部分,还没匹配到,但是预测可以匹配,回顾指已经匹配过的部分符合要求
零宽指的是这4种形式匹配的都只是位置,比如在某个位置符合后面满足某某条件,并不会将后面满足的条件返回
断言是指一种条件满足判断,有兴趣可以百度一下

上述不管哪个形式,它们匹配的都只是位置,不匹配任何字符

1.正预测零宽断言(?=(exp))

表示预测某个位置的后面可以满足exp表达式
<pre name="code" class="java">String regex = "windows(?=(2003))";//这个意思是先判断windows出现的位置,在s的后面这个位置是否满足(2003)的匹配
Pattern patten = Pattern.compile(regex);
Matcher matcher1 = patten.matcher("windows2003");
//所以这个结果并不会匹配成windows2003,这个零宽它断言的只是位置,所以他匹配结果就是windows
Matcher matcher2 = patten.matcher("windows7");
//这个s的后面不满足2003的条件,所以这个匹配结果不存在
if(matcher1.find()){
	System.out.println("第1个表达式:" + matcher1.group());
}
if(matcher2.find()){
	System.out.println("第2个表达式:" + matcher2.group());
}

 这个也可以这么使用: 
  
String regex = "(?=.{8,})[a-zA-Z]+.*";
//正预测零宽断言,断言某个位置点它满足长度8位以上,并且这个点之后他满足\\w+.*
//即判断一个字符串是否满足长度大于等于8并且以字母开头
System.out.println("s78fea5".matches(regex));//false	符合字母开头,但是长度小于8,即开头位置不符合后面大于等于8个字符 
System.out.println("4ss78fe52".matches(regex));//false	开头位置符合后面大于等于8个字符,但是该位置后面不满足字母开头
System.out.println("s78feda52".matches(regex));//true	另个条件均满足

2.负预测零宽断言(?!(exp))

它跟1的区别就在于表达式不满足(exp)条件,将1 的
String regex = "windows(?=(2003))"
条件改为
String regex = "windows(?!(2003))"
则它匹配的是s后的位置不满足2003的条件,所以wndows7满足条件,windows2003不满足条件

3.正回顾零宽断言(?!(exp))

回顾,即判断当前点的位置左边已扫描过的部分,所以才叫回顾,这个"<"也指向了回顾的位置
String regex = "(?<=(office))2003";//这个意思是先判断2003出现的位置,在2的前面这个位置判断是否存在office
Pattern patten = Pattern.compile(regex);
Matcher matcher1 = patten.matcher("windows2003");
//先找出要端砚的位置(2之前的位置,即e与2之间),再判断这个位置的左边(回顾)是否满足office,于是匹配失败
Matcher matcher2 = patten.matcher("office2003");
//先找出要端砚的位置(2之前的位置),再判断这个位置的左边(回顾)是否满足office,于是匹配成功
if(matcher1.find()){
	System.out.println("第1个表达式:" + matcher1.group());
}
if(matcher2.find()){
	System.out.println("第2个表达式:" + matcher2.group());//返回:第2个表达式:2003
}

第4点同理

猜你喜欢

转载自blog.csdn.net/l707268743/article/details/53081418