新闻中心> 文章详情

Java正则表达式中的Possessive数量修饰词的理解

2015年09月21日

  正则表达式对于数量限定符如 ?, + , *, {n, m} 的匹配默认是贪婪模式,比如:


  a.*b 匹配 acbab 的结果是 acbab 而不是acb,南京Java培训机构


  正则表达式支持懒惰模式,也就是在数量限定符后加一个数量修饰词(quantifier),用问号表示, 比如:


  a.*?b 匹配 acbab 的结果是 acb 而不是acbab  南京Java培训


  而Java语言在正则表达式中支持一种Possessive 数量修饰词 ,用加号表示。其字面意思是像贪婪模式一样匹配,但不回溯。这到底是什么意思呢?其实这和匹配算法相关,比如:南京Java培训


  在贪婪模式下,正则表达式 a.*b 在匹配 acbac时,在匹配成功第一个字符a后,匹配算法会继续往后读取字符a之后的字符来匹配.* , 这时贪婪模式就起作用了,a后面的cbac都能匹配.*,但当匹配算法继续往后读取字符时,发现已经没有字符可读了,无法匹配正则表达式中的b了,于是就回溯一个字符,看c是否能匹配b,不能,继续回溯,直到回溯到b时,才匹配到了acb。 而a.*+b在匹配时是不会回溯的,也就是说当贪婪地读到最后一个字符时发现无有字符与b匹配了,就认为匹配失败了。南京Java培训


  江苏万和小编再举几个例子


  (ab)*+a 匹配 ababacd 时 可以匹配到 ababa , 因为两个ab之后没有ab了,无法贪婪


  a?+a 匹配aaaaa 时会匹配到 aa ,但 a++a和a{0, 10}+a却会匹配失败


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入