正则的回溯引用(搜索)

[b]正则表达式: 回溯应用<前后一致匹配>[/b]
[b]子表达式回顾:子表达式即把一组字符编组为一个字符集合
1. 这样的字符集合主要用于精确设定需要重复匹配的文本及其重复次数。
2 用于回溯引用
[/b]

实例一: 假设有下面以文本内容:

<h1>魔兽世界</h1>
<ul><a href="http://zhanhun.uuu9.com/hd/zhanhun0927.html">斩魂</a>
<li>单机游戏</li>
</ul>
<h1>植物大战僵尸</h2>
<h3>小游戏</a></h3>
<td>愤怒的小鸟</td>

现在要找出所有标题文字,不管其实多少级。

如是很容易想到如下的正则模式: [hH][1-6].*?[hH][1-6] 初看没有任何问题,但是匹配发现结果如下:

<h1>植物大战僵尸</h2>
<h3>小游戏</a></h3>
<h1>魔兽世界</h1>

上面的结果中很显然你会发现有一个非法的标题进入(<h1>植物大战僵尸</h2>),应该是被过滤掉的。

出现这种情况的根源在第二部分<用来匹配结束标签的那个部分>对这个模式的第一部分<用来匹配开始标签的那个部分>毫无所知。 要想解决这样在此只能依靠

回溯引用了。




第二个实例: 找出一文本中所有连续重复出现的单词找出来。很明显,在搜索某个单词的第二次出现时,这个单词必须是已知的。

回溯匹配引用容许正则表达式模式引用前面的匹配结果。

文本内容: I will wait wati for you you at airport tonight at five sharp sharp o'clock.

正则表达式模式: []+(\w+)[]+\1

上面的模式找到了所想要的东西,如何做到的呢?

[]+ 匹配一个或多个空格, \w+匹配一个或多个字母数字字符,[]+匹配随后的空格。

注意: \w+是在()里面的,它是一个子表达式。 这个子表达式不是用来进行重复匹配的,这里根本不涉及重复匹配的问题。

这个子表达式只是把整个模式的一部分单独划分出来一边在后面引用。

这个模式最后的部分是\1;这是一个回溯引用,而他引用的正事前面火焚出来的那个子表达式:当(\w+)匹配但wati 的时候,\1也匹配单词wait;....



[b]注意: 回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。 \1代表这模式里的第一个子表达式;\2代表这第二个子表达式...
[/b]


通过实例二,可以回想实例一的解决办法:<([hH][1-6])>.*?</\1> 或者<[hH]([1-6]).*?</[hH]\1>

特别提醒: 不同的正则表达式在实现回溯引用的语法方面往往有这巨大的差异。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值