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

  • 相关阅读:
    Python批量 png转ico
    线性回归
    【论文集合】多语言机器翻译
    【论文集合】curriculum learning总结/课程学习论文
    crf++分词
    强化学习的探索策略方式
    关于multiprocessing中的logging的数据打印到本地失败或重复问题
    置信区间绘图、以10次平均值为例
    打印CSDN博客内容JS
    SUMO学习笔记(3)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4783690.html
Copyright © 2011-2022 走看看