zoukankan      html  css  js  c++  java
  • 正则表达贪心懒惰与占有

    贪心

    我们知道我们的量词是贪心的。

    我写下来: /d{1,5}

    那么它匹配了5个。

    那么量词的匹配规则是啥呢?

    量词首先匹配整个字符串,如果失败然后回退一个字符,然后再次进行匹配。这就是回溯。

    它会每次回退一个字符,然后找到为止。然后呢,它还有记录所以行为,想想是不是消耗有点大。

    没错这一章,就是用来提高效率的,对爬虫挺关键的一个东西。

    那么什么是惰性的呢?

    它是从目标为位置开始匹配,每次检查字符串的一个字符,然后还是会尝试匹配整个字符。

    也就是说,贪心先把整个给匹配,然后惰性一个一个来,那么它会遇到不匹配的,这时候就结束。但是依然会去匹配整个字符一次。

    最后一个是占有。

    占有两次会覆盖整个目标,然后尝试匹配内容,但是至少尝试一次。

    这个听起来不明白哈,我下面有个例子就很明白的了。

    正文

    我们先来看几个简单的字符:

    语法 描述
    ? 零个或者一个
    + 一个或者多个
    * 零个或者多个

    我们看下有什么方法可以替代他们:

    ? 我们可以用 {0,1}

    • 可以用 {1,}
    • 可以用{0,}

    贪心

    这个不必多讲。

    比如说有5,然后我写一个5?,那么5就会被匹配。不是说好5?是可有可无吗?就是因为贪心,可有可无就是有。

    惰性

    还是上面这个例子,5?,然后我加一个?,也就是5??,我们的文本还是5。然后发现一个都不匹配了。这时候就是惰性了。
    然后再匹配一个5*?,发现也一样没有匹配到啥东西。


    然后5+?:

    匹配了一个,果然只有是能符合的马上就结束了。

    语法 描述
    ?? 惰性匹配0或1次
    +? 惰性匹配1到多次
    *? 惰性匹配0到多次
    {n}? 惰性匹配n次
    {n,}? 惰性匹配n到多次
    {n,m}? 惰性匹配1到n次

    这里有人会理解+?,就是一个哈。其实不是的。
    来一个例子对比下:

    惰性:

    贪婪:

    惰性是匹配完了就不匹配了,而贪婪是看看还有更多不。

    5*? 与 5555不是说真的没有匹配到。而是:

    这是因为后面没有条件,那么就躺尸了。改一下:

    占用

    这个非常像贪心,但是不会回溯,很好理解,下面给个例子哈。
    0*0 去匹配00000:


    是可以匹配的。
    但是我换成0*+0,

    告诉我没有匹配,为什么呢?

    我们来看下贪心,0*把整个字符匹配了,也就是匹配5个,然后无法匹配0,失败。然后呢,回溯,退一个字符。匹配4个0。这下就匹配上了。

    占用可就不一样了,比较自私0*把整个字符匹配了,也不回溯,但是要占用它,然后就永远匹配不是,结束,效率高哈。

    语法 描述
    ?+ 占用匹配0或1次
    ++ 占用匹配1到多次
    *+ 占用匹配0到多次
    {n}+ 占用匹配n次
    {n,}+ 占用匹配n到多次
    {n,m}+ 占用匹配1到n次
  • 相关阅读:
    不足百行代码 实体数组转DataTable通用类
    【翻译】WEB安全设计规范(4.1)
    也为读者说几句(兼为什么要骂烂书译者)
    重用之前应仔细分析问题用错轮子有感
    最长代码有多长:不符[单一职责原则(SRP)]的常见设计
    "千里之堤毁于蚁穴"重点项目不能交付之谜(一)泥淖中的验收测试
    企业快速开发框架基于配置文件
    从面试题看高级软件工程师需要哪些技艺
    面试英语【转】
    测试
  • 原文地址:https://www.cnblogs.com/aoximin/p/12771949.html
Copyright © 2011-2022 走看看