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]+),后面跟着一个冒号。

  • 相关阅读:
    windows系统使用sketch设计的设计稿
    移动端点击按钮复制链接
    设置display:inline-block 元素间隙
    修改url中参数值
    fiddler主要图标说明
    fiddler抓包工具
    数据库删除
    having的用法
    left join on和where
    Statement和PreparedStatement有什么区别?哪个效率高?
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4783690.html
Copyright © 2011-2022 走看看