正则表达式,贪婪非贪婪模式

上一篇 / 下一篇  2014-07-16 15:13:47 / 个人分类:Jmeter学习

【如下摘自:http://blog.csdn.net/lxcnn/archive/2009/11/02/4756030.aspx 】

1、例子:

源字符串:aa<div>test1</div>bb<div>test2</div>cc

正则表达式一:<div>.*</div>

匹配结果一:<div>test1</div>bb<div>test2</div>

正则表达式二:<div>.*?</div>

匹配结果二:<div>test1</div>(这里指的是一次匹配结果,所以没包括<div>test2</div>)

根据上面的例子,从匹配行为上分析一下,什是贪婪与非贪婪模式。

正 则表达式一采用的是贪婪模式,在匹配到第一个“</div>”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝 试匹配,查看是否还有更长的可以成功匹配的子串,匹配到第二个“</div>”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为 “<div>test1</div>bb<div>test2</div>”。当然,实际的匹配过程并 不是这样的,后面的匹配原理会详细介绍。

仅从应用角度分析,可以这样认为,贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。

正则表达式二采用的是非贪婪模式,在匹配到第一个“</div>”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“<div>test1</div>”。

仅从应用角度分析,可以这样认为,非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。

2、贪婪与非贪婪模式的前提--匹配成功

在上面从应用角度分析贪婪与非贪婪模式时,一直提到的一个前提条件就是“整个表达式匹配成功”,为什么要强调这个前提,我们看下下面的例子。

正则表达式三:<div>.*</div>bb

匹配结果三:<div>test1</div>bb

修 饰“.”的仍然是匹配优先量词“*”,所以这里还是贪婪模式,前面的“<div>.*</div>”仍然可以匹配到 “<div>test1</div>bb<div>test2</div>”,但是由于后面的“bb” 无法匹配成功,这时“<div>.*</div>”必须让出已匹配的“bb<div>test2< /div>”,以使整个表达式匹配成功。这时整个表达式匹配的结果为“<div>test1< /div>bb”,“<div>.*</div>”匹配的内容为“<div>test1< /div>”。可以看到,在“整个表达式匹配成功”的前提下,贪婪模式才真正的影响着子表达式的匹配行为,如果整个表达式匹配失败,贪婪模式只会影 响匹配过程,对匹配结果的影响无从谈起。

非贪婪模式也存在同样的问题,来看下面的例子。

正则表达式四:<div>.*?</div>cc

匹配结果四:<div>test1</div>bb<div>test2</div>cc

这 里采用的是非贪婪模式,前面的“<div>.*?</div>”仍然是匹配到“<div>test1< /div>”为止,此时后面的“cc”无法匹配成功,要求“<div>.*?</div>”必须继续向右尝试匹配,直到匹 配内容为“<div>test1</div>bb<div>test2</div>”时,后面的 “cc”才能匹配成功,整个表达式匹配成功,匹配的内容为 “<div>test1</div>bb<div>test2</div>cc”,其中 “<div>.*?</div>”匹配的内容为“<div>test1< /div>bb<div>test2</div>”。可以看到,在“整个表达式匹配成功”的前提下,非贪婪模式才真正的影 响着子表达式的匹配行为,如果整个表达式匹配失败,非贪婪模式无法影响子表达式的匹配行为。


TAG:

 

评分:0

我来说两句

日历

« 2024-05-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 4706
  • 日志数: 7
  • 建立时间: 2014-07-16
  • 更新时间: 2014-07-17

RSS订阅

Open Toolbar