正则表达式

正则表达式 知识量:10 - 22 - 55

8.2 回溯引用匹配><

使用回溯引用进行查找- 8.2.1 -

使用回溯引用的简单例子之一就是找到重复的单词,如下所示:

示例文本:找到重复的单词。

Today is is sunday,
I want to travel to Shanghai,
but I do not not have money.

正则表达式:

[ ]+(\w+)[ ]+\1

结果:

MatchPositionLength
is is56
not not588
以上代码成功的找出了错误的重复单词,而正确的重复(to travel to)则没有匹配,它工作的很好。

下面解释一下以上正则表达式的工作原理:

  • [ ]+ 表示一个或多个空格。

  • (\w+) 表示一个或多个字符,注意它是一个子表达式,通过括号括起来了。

  • [ ]+ 表示一个或多个空格。

  • \1 表示一个回溯引用,以“\”开头,数字1表示引用第一个子表达式。

在搜索某个单词的第二次出现时,这个单词必须是已知的,回溯引用正是做这个工作的。回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,可以将回溯引用想象成变量,在以上示例中,(w+)就是定义的变量,\1就是对这个变量的引用。事实上,某些语言已经实现了“命名捕获”,即给某个子表达式起一个唯一的名字,然后用这个名字来引用这个子表达式。

注意:回溯引用利用子表达式在字符串中的位置来进行定位,\1表示第一个子表达式,\2表示第二个...以此类推,因此子表达式的位置十分重要。

解决错误标签匹配问题- 8.2.2 -

接下来解决先前的匹配错误标签问题,使用回溯引用就可以了。

示例文本:

<!DOCTYPE html>
<html>
    <head>
        <title>index</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <div>TODO write content</div>
        <h1>Workday</h1>
        <h2>Monday</h2>
        <h2>Tuesday</h2>
        <h2>Wednesday</h2>
        <h2>Thursday</h2>
        <h2>Friday</h3>
    </body>
</html>

正则表达式:

<[hH]([1-6])>.*?</[hH]\1>

结果:

MatchPositionLength
<h1>Workday</h1>16316
<h2>Monday</h2>18815
<h2>Tuesday</h2>21216
<h2>Wednesday</h2>23718
<h2>Thursday</h2>26417

上面的正则表达式通过使用回溯引用,成功的排除了“<h2>Friday</h3>”这个错误标签。