zoukankan      html  css  js  c++  java
  • 正则表达式的懒惰匹配?

    像+ * ? 以及{M,N}
    这几种量词(匹配数量)默认是属于贪婪量词,进行贪婪匹配
    什么叫做贪婪匹配呢?贪婪就是尽可能的多匹配,贪心的意思
    比如现在目标字符串是 AAAA 四个A组成的字符串
    A* 和 A+ 都会匹配 AAAA
    A? 则会匹配 A
    这就是贪婪匹配,实际运用中,有的时候我们却希望尽可能少的匹配
    比如目标字符串 <span>a</span><span>b</span>
    此时如果我们使用了贪婪量词
    <span>.*</span> 则会匹配 <span>a</span><span>b</span> 整个字符串
    可是我们只想要匹配第一对span标签怎么办?

    此时就需要用到懒惰量词,意思也很明显了,能偷懒就偷懒,呵呵,懒惰量词与贪婪量词的差别就是在贪婪量词的后面加个?号,就构成了懒惰量词

    如下表
    贪婪量词        懒惰量词
    A*                         A*?
    A+                        A+?
    A?                        A??
    A{M,N}                  A{M,N}?
    还是以目标字符串 AAAA  来讨论
    A*?    
    *号是匹配0次或多次,要偷懒怎么办呢?当然是最少次数了,也就是0   所以在这里匹配的结果是
    没有匹配到任何内容
    A+?
    +是1次或多次,分析方法同上,最少次数是1次,所以匹配结果就是 A
    A??
    ?是0次或1次,所以这里也不进行匹配,会偷懒吧,呵呵
    

    再来看看刚刚的
    <span>a</span><span>b</span>
    要匹配第一对span,用懒惰量词就是<span>.*?</span>
    我已经说的够明白了吧?这些内容我以前都是查了好多资料才知道的。
    正则表达式是相当强大的语言,尤其在进行字符匹配和查找时,当然要需要花一定的时间才能掌握,如果有问题可以百度HI我,进行探讨

    总之, 我们平常看到的, 比较常用的 ".*?", 就是 匹配最少的任意字符, 直到最近的后面那个"字面字符". //is, /[.*?]/is 以及其他 两边是 实体字符串、中间是.*?的就是包含最少的、最近的实体字符串的 匹配内容."

    '/[.*?]/is' 的就是在最近的两个 "字面字符" []之间的内容.

    对于 $subject = "<span>acx</span><span>xxkk</span>"
    #<span>.*</span>#  这种贪婪匹配的是整个  "<span>acx</span><span>xxkk</span>";
    #<span>.*?</span># 这种懒惰匹配, 的是: "<span>acx</span>" 最近的...
    .点号, 是除了 换行符 
    之外的 任意字符.
    
    .*+字面字符, 是指:  贪婪匹配, 直到最后一个出现的 字面字符,
    .*? + 字面字符, 是指: 懒惰匹配, 一旦发现 第一次出现的 字面字符就停止...
    

    正则匹配中的附加参数:

    /u是 utf-8 匹配, 针对汉字等多字节字符串, /i是insensitive, /s 与 /m是相对的, 表示/single /multiple, 是把字符串视为单行或者多行? 所以正则匹配或者正则替换的时候, 都是先写 preg_match_all('//is', $subject,$matches). 然后再来写 匹配模式字符串.

    ========================================

  • 相关阅读:
    51nod1238. 最小公倍数之和 V3(数论)
    LOJ565. 「LibreOJ Round #10」mathematican 的二进制(NTT)
    【LCA】BZOJ1776-[Usaco2010 Hol]cowpol 奶牛政坛
    【单调队列】BZOJ1342-[Baltic2007]Sound静音问题
    【并查集&&带权并查集】BZOJ3296&&POJ1182
    【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)
    【Floyd矩阵乘法】BZOJ1706- [usaco2007 Nov]relays 奶牛接力跑
    【搜索+DP】codevs1066-引水入城
    【扩展欧几里得】BZOJ1477-青蛙的约会
    【扩展欧几里得】codevs1200-同余方程
  • 原文地址:https://www.cnblogs.com/bkylee/p/5314010.html
Copyright © 2011-2022 走看看