正则表达式 知识量:10 - 22 - 55
使用回溯引用的简单例子之一就是找到重复的单词,如下所示:
示例文本:找到重复的单词。
Today is is sunday, I want to travel to Shanghai, but I do not not have money.
正则表达式:
[ ]+(\w+)[ ]+\1
结果:
Match | Position | Length |
---|---|---|
is is | 5 | 6 |
not not | 58 | 8 |
下面解释一下以上正则表达式的工作原理:
[ ]+ 表示一个或多个空格。
(\w+) 表示一个或多个字符,注意它是一个子表达式,通过括号括起来了。
[ ]+ 表示一个或多个空格。
\1 表示一个回溯引用,以“\”开头,数字1表示引用第一个子表达式。
在搜索某个单词的第二次出现时,这个单词必须是已知的,回溯引用正是做这个工作的。回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,可以将回溯引用想象成变量,在以上示例中,(w+)就是定义的变量,\1就是对这个变量的引用。事实上,某些语言已经实现了“命名捕获”,即给某个子表达式起一个唯一的名字,然后用这个名字来引用这个子表达式。
注意:回溯引用利用子表达式在字符串中的位置来进行定位,\1表示第一个子表达式,\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>
结果:
Match | Position | Length |
---|---|---|
<h1>Workday</h1> | 163 | 16 |
<h2>Monday</h2> | 188 | 15 |
<h2>Tuesday</h2> | 212 | 16 |
<h2>Wednesday</h2> | 237 | 18 |
<h2>Thursday</h2> | 264 | 17 |
上面的正则表达式通过使用回溯引用,成功的排除了“<h2>Friday</h3>”这个错误标签。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6