首页 未命名正文

linux编程_Java 正则表达式学习

云返利网 未命名 2020-05-26 09:05:42 14 0

匹配模式

JDK提供三种匹配模式,划分是:贪心模式(greedy),委曲模式(reluctant)和占有模式(possessive),划分对应三种占有量词,其中贪心模式是默认的模式,委曲模式通过在表达式后面加一个?来示意。占有模式通过在表达式后面加一个+来示意。

三种模式的寄义是什么呢?

贪心模式的寄义是:尽可能多的匹配,同时也只管知足整体匹配。
 委曲模式的寄义是:尽可能少的匹配,同时也只管知足整体匹配。
 占有模式的寄义是:尽可能多的匹配,若是由于匹配多了导致整理无法匹配,那么也不会回溯。

好比有个字符串如下:
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n


贪心模式的表达式匹配:
/m/t.*/nl/n/p/m 
此时匹配效果为 /m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m


委曲模式的表达式匹配:
/m/t/.*?/nl/n/p/m
此时匹配效果为 /m/t/wd/nl/n/p/m
 
/m/t/wdx+?/nl/n/p/m 
若是是这样,那么就匹配不上了,由于+示意至少要匹配一个,委曲模式,至少也要匹配一个,以是匹配失败了。


占有模式的表达式匹配:
/m/t.*+/nl/n/p/m 此时无法匹配,由于.*匹配了过多的字符,导致后面无法匹配是上了。


注重:只能对可变的匹配规则使用委曲量词或者占有量词。好比X??示意只管少匹配字符X,而X?却是默认的贪心模式,此时是只管多匹配的寄义。再如:X{n}的寄义是必须准备匹配n个X ,则此时加上其他量词均不起作用

环视(展望)

环视是一个对照高级的主题,然则用起来却是那么自然。
 环视适用于这样的场景:做正则匹配时,需要领会被匹配部门的前面或者后面,有或者没有,特定的表达式,而又不因此捕捉(消耗)这些特定的表达式。
 若是不使用环视,而是直接使用表达式来判断,那么必然会导致这些被匹配的表达式被消耗掉。

举个例子:假设我要给ILoveYou这句话断句,原则是泛起大写字母则认为是一个新的单词。

若是使用这个匹配规则:
\p{Upper}\p{Lower}*[\p{Upper}]?


的话,那么会消耗掉被匹配的大写字母。匹配效果会是:
IL
You


这并不符合要求。

解决办法是使用环视,正则表达式为:
\p{Upper}?\p{Lower}*(?=[\p{Upper}]?)


输出效果为:
I
Love
You


环视有四种:
(?=X) 示意后面随着的是正则表达式X,匹配前面的部门时,不会消耗X这一部门,同时也不会捕捉。零宽度正向一定展望。

(?<=X) 示意前面的是正则表达式X,匹配后面的部门时,不会消耗X这一部门,同时也不会捕捉。 零宽度反向一定展望。

 (?!X) 示意后面随着的不是正则表达式X,匹配前面的部门时,不会消耗X这一部门,同时也不会捕捉。零宽度正向否认展望。
 
(?!=X) 示意前面的不是正则表达式X,匹配后面的部门时,不会消耗X这一部门,同时也不会捕捉。 零宽度反向否认展望。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)