Chapter 5 回溯引用

1 概述

在正则表达式中,往往前后匹配的模式存在一定的关系,比如后面匹配的和前面的部分要求保持一致,这个时候就需要用到回溯引用了。回溯引用的具体定义是指模式的后半部分引用在前半部分中定义的子表达式。

2 经典案例

2.1 引子

为了更好的理解回溯引用的作用,这里引用一个经典的案例。HTML程序员经常使用标题标签(<H1>到<H6>以及配对的结束标签)来定义和排版Web页面中的标题文字。现在,我们就重现这个需求。比如,需要提取下图中的Web页面中的所有级别的标题文字。不难想到可以利用如下正则表达式:<H[1-6]>.*?</H[1-6]>(注意,这里用了懒惰式的匹配,具体参考:Chapter 3 正则表达式的贪婪与懒惰)。匹配的结果可以初步达到目的,如下图所示。

2.2 回溯引用解决的问题

可是,如果上面需要匹配的文本稍微改变一下,如下图所示,原有的正则表达式就会出现错误。第四行文本:<H3>wrong match</H4>,显然不是一个合法的标题标签也被匹配出来了。究其原因,是因为在原有的正则中没有对起始标签和结束标签进行任何的限定。而对于一个合法的HTML的标题标签,其起始标签和结束标签的级别是相等的。

解决这个问题,就需要用到回溯引用了。只需要将正则表达式改为:<H([1-6])>.*?</H\1>,就可以达到目的,结果如下图。

现在的正则表达式和原有的相比有两个不同点,第一:前面的数字部分(及[1-6])加上了(),第二:后面的数字部分被替换成了\1,其中\1表示的是第一个子表达式,而子表达式就是用()界定的部分。

3 回溯引用在替换操作中的作用

回溯表达式除了上述的界定前后部分的匹配关系的作用外,在替换操作中也用着强大的威力,具体可以参考:Chapter 6 正则表达式在Java中的应用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值