欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则的回溯引用(搜索) 正则表达式回溯匹配分组匹配正则的回溯引用(搜索) 

程序员文章站 2022-04-18 13:15:10
...
正则表达式: 回溯应用<前后一致匹配>
子表达式回顾:子表达式即把一组字符编组为一个字符集合
1. 这样的字符集合主要用于精确设定需要重复匹配的文本及其重复次数。
2  用于回溯引用

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

<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;....



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


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

特别提醒: 不同的正则表达式在实现回溯引用的语法方面往往有这巨大的差异。