zoukankan      html  css  js  c++  java
  • 正则表达式杂项(1)

    以前在用的时候明白,过后就忘了,总结一些杂项点,引起注意:

    1. 大多数正则表达式引擎是NFA,也就是Regex Based引擎,当然.net的也不例外。其行为特征就是以pattern中的字符去匹配input中的字符,而不是相反。
    2. Regex Engine的行为特征:热情原则”:一旦存在一个匹配,则报告匹配成功,而不进行进一步的尝试。这在可替换符号|存在时非常明显,比如:p: head|headchen  text: My name's headchen  当获得一个匹配head时就报告匹配成功,而不尝试后面的headchen。
    3. greedy (贪婪性)。对于限定符:? * + {m,n}来说,匹配行为是贪婪的,就是对限定的字符或者分组“尽可能匹配”,直到不匹配为止。此时若pattern还有其他项,则出现backtracking(回溯),也就是从后往前丢弃匹配(形象一点就是把吃进去的吐出来),在吐出来的点上尝试匹配后面的项,一旦匹配(行为2),则宣告成功,若还存在其他项,以此类推。此时出现回溯现象:回溯的条件为:当前模式项匹配失败,回溯的目的:在当前项成功的前提下,让其弟弟也匹配成功。比如: <.+> 对于 <book><title /> </book>,来说会匹配整个字符串而不是<book>。
    4. lazy(惰性)。在限定符后面再加上?,出现了lazy行为。此时的过程大致为:对于限定符限定的模式,先尽可能少的匹配,然后拿出第二个模式项进行匹配,若不成功,则回溯到前面成功的地方,尝试+1匹配,若成功,继续后面的模式项,以此类推。也就是说:也存在回溯,只不过回溯的条件变为:其后面项的匹配失败。回溯的目的:通过加大当前项匹配的长度来尝试其弟弟也能够匹配成功。一般情况下,同为回溯,贪婪回溯的成本较低,而lazy回溯的成功较高。(这和感觉上的正好相反,其实只要仔细模拟一下就可以得出结论了)。

    5 位置匹配(零宽度断言),诸如\b ^ $ \A \Z \G \B \a \z 其行为是仅仅匹配位置,而不消耗字符。也不移动指针,有时能够匹配空串,此时指针指向void。这一点请注意!!

    6 零宽度匹配,到存在限定符* ?时,对于0次也是一个成功的匹配,其匹配的结果就是()空串。此时NextMatch的行为有些特殊。通常,NextMatch 在上一个匹配正好停止的地方开始下一个匹配。不过,在一个空匹配后,NextMatch 前进一个额外的字符,然后尝试下一个匹配。此规则确保匹配引擎在整个字符串中将匹配进行下去。(如果它没有前进一个额外字符,则下一个匹配将就在前一个匹配的同一个位置开始,并且它将重复匹配同一个空字符串。)

    待续...

  • 相关阅读:
    windows的磁盘操作之七——获取当前所有的物理磁盘号 加备注
    ajax后台处理响应(java)
    单词前后位置颠倒,大小写颠倒
    电话面试总结(问的很细).md
    HTTP协议
    Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
    Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
    TCP协议三次握手和四次握手
    OSI参考模型总结
    Java并发——CAS
  • 原文地址:https://www.cnblogs.com/headchen/p/833785.html
Copyright © 2011-2022 走看看