美文网首页
贪婪与非贪婪匹配模式原理

贪婪与非贪婪匹配模式原理

作者: pixels | 来源:发表于2017-12-12 16:01 被阅读44次

    转载自http://blog.csdn.net/lxcnn/article/details/4756030
    源字符串: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>)

    下面从匹配原理角度分析的匹配过程。


    35916_1265676086dlqj.jpg

    首先由“<”取得控制权,由位置0位开始尝试匹配,匹配字符“a”,匹配失败,第一轮匹配结束。第二轮匹配从位置1开始尝试匹配,同样匹配失败。第三轮从位置3开始尝试匹配,匹配字符“<”,匹配成功,控制权交给“d”。
    “d”尝试匹配字符“d”,匹配成功,控制权交给“i”。重复以上过程,直到由“>”匹配到字符“>”,控制权交给“.”。
      “.
    ”属于贪婪模式,将从B处后的字符“t”开始,一直匹配到E处,也就是字符串结束位置,将控制权交给“<”。
      “<”从字符串结束位置尝试匹配,匹配失败,向前查找可供回溯的状态,把控制权交给“.”,由“.”让出一个字符“c”,把控制权再交给“<”,尝试匹配,匹配失败,向前查找可供回溯的状态。一直重复以上过程,直到“.*”让出已匹配的字符“<”,实际上也就是让出了已匹配的子串“</div>cc”为止,“<”才匹配字符“<”成功,控制权交给“/”。
    接下来由“/”、“d”、“i”、“v”分别匹配对应的字符成功,此时整个正则表达式匹配完毕。

    案例:

    var str = 'The Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps Over The Lazy Dog'.match(/quick\s(brown).+(jumps)/ig)
    ["Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps"];
    str.match(/quick\s(brown).+(jumps)/ig)
    结果:["Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps"]
    
    str.match(/quick\s(brown).+?(jumps)/ig)
    结果:["Quick Brown Fox Jumps"]
    

    相关文章

      网友评论

          本文标题:贪婪与非贪婪匹配模式原理

          本文链接:https://www.haomeiwen.com/subject/ilifuttx.html