`

正则的相关内容,对 贪婪、非贪婪模式

阅读更多
前几天看正则的相关内容,对 贪婪、非贪婪模式,不太理解,今天在网上看到一篇好文章,写得很好,目前看了前面自己需要的一部分,对贪婪、非贪婪模式有了一些感觉。摘抄文中的例子如下:

【如下摘自: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>”。可以看到,在“整个表达式匹配成功”的前提下,非贪婪模式才真正的影响着子表达式的匹配行为,如果整个表达式匹配失败,非贪婪模式无法影响子表达式的匹配行为。

~~~~~~ 以上摘抄 完~~~~~~~
分享到:
评论

相关推荐

    正则表达式——贪婪非贪婪模式.rar

    在这其中,正则表达式的贪婪模式与非贪婪模式是两个关键的概念,它们决定了正则表达式如何处理连续重复的字符或字符集。深入理解这两种模式的差异,对于编写高效且准确的正则表达式至关重要。 首先,让我们探讨贪婪...

    Python 正则式表达 12贪婪模式和非贪婪模式.mp4

    Python 正则式表达 12贪婪模式和非贪婪模式.mp4

    正则基础之——贪婪与非贪婪模式 .rar

    在正则表达式的世界里,贪婪与非贪婪模式是两种重要的匹配策略,它们决定了正则表达式在查找匹配时的行为。这两个概念对于任何想要深入理解正则表达式的开发者来说至关重要。 首先,我们来理解一下“贪婪”模式。...

    JS正则表达式学习之贪婪和非贪婪模式实例总结

    本文将详细介绍JavaScript中正则表达式的贪婪模式和非贪婪模式,包括它们的具体功能、使用方法和相关注意事项。 首先,让我们来看一段示例代码: ```javascript try{ var str="&lt;p&gt;abcdefg&lt;/p&gt;&lt;p&gt;abcdefghijkl...

    详解正则表达式的贪婪模式与非贪婪模式

    什么是正则表达式的贪婪与非贪婪匹配 ...下面通过实例代码看下正则表达式的贪婪模式与非贪婪模式,具体内容如下所示: 贪婪模式:能匹配的最大部分  s = This is a number 234-235-22-4223 r = re

    正则表达式之 贪婪与非贪婪模式详解(概述)

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎...

    正则表达式--递归匹配与非贪婪匹配

    ### 正则表达式——递归匹配与非贪婪匹配 #### 一、递归匹配 在正则表达式中,递归匹配是一个重要的概念,它主要用于处理那些具有嵌套结构的数据,例如数学公式中的括号匹配或HTML标签的匹配。 ##### 1.1 嵌套...

    python中如何使用正则表达式的非贪婪模式示例

    使用非贪婪模式,你可以更准确地定位目标内容。 总结一下,Python中的正则表达式非贪婪模式是一个重要的概念,它允许我们控制正则表达式匹配的范围,避免过度匹配。熟练掌握贪婪模式和非贪婪模式的转换,能帮助我们...

    php正则表达式中的非贪婪模式匹配

    3. **性能考量**:虽然非贪婪模式在某些场景下能够提供更准确的匹配结果,但在实际开发中也需要注意其对性能的影响。由于非贪婪模式的匹配逻辑更为复杂,可能会导致性能下降。因此,在设计正则表达式时,需要根据...

    JavaScript正则表达式的贪婪匹配和非贪婪匹配

    在上述例子中,即使使用非贪婪模式,正则表达式也必须匹配所有的'a'来确保后续的'b'能够被找到,因此结果与贪婪匹配相同。 3. **理解非贪婪匹配的工作原理**: 当使用非贪婪量词时,正则引擎首先找到最左边的匹配...

    python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析

    本文实例讲述了python 正则表达式贪婪模式与非贪婪模式原理、用法。分享给大家供大家参考,具体如下: 之前未接触过正则表达式,今日看python网络爬虫的源码,里面一行正则表达式匹配的代码初看之下,不是很理解,...

    浅谈php正则表达式中的非贪婪模式匹配的使用

    总结一下,非贪婪模式匹配是正则表达式中的一个重要概念,它能帮助我们更加精确地控制匹配的范围。通过在量词后添加问号 "?",我们可以让正则表达式尽可能少地匹配字符,这对于处理含有多个相同模式的复杂字符串特别...

    [正则表达式]贪婪模式与非贪婪模式

    ### 正则表达式中的贪婪模式与非贪婪模式 在正则表达式中,贪婪模式与非贪婪模式是两种常见的匹配策略,它们控制着匹配器如何解析文本中的模式。这两种模式的区别在于匹配长度的选择上:贪婪模式试图尽可能多地匹配...

    小议正则表达式效率 贪婪、非贪婪与回溯

    通过这些例子和分析,我们可以看到在使用正则表达式进行编程时,正确使用贪婪和非贪婪模式的重要性。尤其是当处理复杂文本和大规模数据时,合理设计正则表达式,可以显著提高代码的执行效率,并避免不必要的性能损耗...

    PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)

    在编写和使用正则表达式时,了解贪婪与非贪婪匹配的概念至关重要,这会直接影响到正则...通常情况下,如果对匹配的字符数量有明确的要求,非贪婪模式会是更安全的选择。不过,具体情况还需根据实际匹配需求灵活运用。

Global site tag (gtag.js) - Google Analytics