zoukankan      html  css  js  c++  java
  • 固化分组

    1、考虑下面的需求,使用[a-zA-Z]+: 去匹配文本,对于文本Subject,分析匹配过程。
    2、[a-zA-Z]+匹配优先,一直吃到t,发现冒号不能匹配,于是使用备用状态,吐出一个字符,
      还是不能匹配,再吐出一个字符......一直继续下去。
    3、这里存在问题,引擎试图吐出一个字符匹配冒号,我们知道这是徒劳的尝试。因为[a-zA-Z]+没有吃下去冒号,当然不可能吐出冒号。
      如果正则表达式引擎足够聪明,意识到这一点,就不需要尝试吐出字符,直接报告匹配失败,也就是说,之前的备用状态应该丢弃。
      但是,一般情况下,引擎没有这么聪明,需要人为的协助,提示引擎不需要吐出字符,也就是丢弃之前的备用状态。
    4、怎么提示引擎呢?
      使用固化分组,如下
      (?>[a-zA-Z]+): (?>[a-zA-Z]+)作为一个整体,吃下去文本,即使后面匹配失败,也不吐出来。
    5、也就是说,使用固化分组可以提前报告匹配失败,不需要进行徒劳的尝试,提高效率。
    6、对于不支持固化分组的程序,可以使用占有优先和环视。
      占有优先,如下 ([a-zA-Z]++):
      环视匹配一个位置,有一个重要的特点,就是匹配尝试结束后,不会留下任何备用状态,因此,使用环视解决上面的问题,如下:
      (?=([a-zA-Z]+))1: (?=([a-zA-Z]+))匹配一个位置,右边是([a-zA-Z]+),1反向引用([a-zA-Z]+),后面跟着一个冒号。

  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4783690.html
Copyright © 2011-2022 走看看