正则学习备忘3—贪婪匹配和惰性匹配

正则学习备忘3—贪婪匹配和惰性匹配
一.贪婪匹配、惰性匹配概述
我们首先从字面意思上来理解一下贪婪匹配和惰性匹配

  贪婪匹配(greedy):它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。找到匹配的之后还是继续查找,若找到不合适的则返回最后一个匹配合适的。 
 惰性匹配(lazy):它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。 

光看上面的定义。找到匹配的之后,立即返回结果,然后再继续查找

 我们很难有一个生动的认识,现在假设我们要匹配下面 <b>和</b> 之间的文本。为了做演示,尽管不符合 HTML 的定义,我们再加入一段<b>和</c>之间的文本。

 Source:  Jimmy is a <b>junior</b> developer <b>living</b> in <b>xi'an</c>.

RegEx: .*
Result:Jimmy is a junior developer living in xi’an.

 上面的粗体部分就是匹配得到的结果,这显然不是我们期望的结果,我们期望的结果是<b>junior</b>和<b>living</b>这两个结果。如果我们使用惰性匹配RegEx为:<b>.*?</b>则能匹配出我们期望的结果。

       

  贪婪匹配的过程:



  惰性匹配的过程:





   这里有两个重要的匹配模式:一个是"{n}",由于这个是精确的匹配几个字符,所以无论是贪婪"{n}"还是惰性"{n}?"其匹配结果是一致的。另外一个是"?"和"??"的区别。

   Source:These flowers are for you,my beloved

   regex:flowers?

   result:flowers

   如果regex:flowers?? 则result:flower 。其实原因很简单,贪婪匹配在查找到flower符合0个之后,还是贪婪的继续查找,找到flowers后还是符合,继续查找再找到flowers后面的空格发现不匹配,则返回最后匹配的flowers。而对于惰性匹配则在找到flower之后则立即返回。因此"??"其实是等价于"{0}"的。
发布了20 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43457125/article/details/90346431