固化分组

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值