回溯引用:前后一致匹配

1、查询一个字符串的重复

回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。 可以把回溯引用想象成变量。

回溯引用只能用来引用模式里的子表达式,用(和)括起来的正则表达式片段

This is a block of of text,several words here are are repeated,and and they should not be

正则表达式:[ ]+(\w+)[ ]+\1
匹配结果:共找到2处匹配
of of 
are are

[ ]+匹配一个或多个空格,
\w+匹配一个或多个字母数字下划线字符,等价于[a-zA-Z0-9_]+
(\w+)是一个子表达式,这个子表达式不是用来进行重复匹配的,只是把整个模式的一部分单独划分出来以便在后面引用。
\1这是一个回溯引用,而它引用的正是前面划分出来的子表达式(即子表达式:(\w+)  )。
\1到底代表什么,它代表着模式里的第一个子表达式,\2代表着模式里的第二个子表达式,\3代表着模式里的第三个子表达式;以此类推。
[ ]+(\w+)[ ]+\1将匹配同一个单词的连续两次重复出现,而且前面一个是一个单独的词,至少前面有一个空格

正则表达式(\w+)[ ]+\1
匹配结果:共找到4处匹配
is is
of of
are are
and and

 

2、html标签开始与结束的匹配(忽略任何不配对的标签组合)

<BODY>
<H1>welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>wireless</H2>
information about Bluetooth,802.11,and more .
<H2>This is not valid HTML</H3>
</BODY>

正则表达式:<H([1-6])>.*?</H\1>

匹配结果:共找到3处匹配
<H1>welcome to my Homepage</H1>
<H2>ColdFusion</H2>
<H2>wireless</H2>

<H([1-6])>匹配任何一级标题的开始标签,
([1-6])第一个子表达式
\1匹配第一个子表达式(即子表达式([1-6]) ,\1只匹配前面子表达式对应的相同的数字。例如前面子表达式结果是2,则后面\1也就只能匹配2,即<H2>开头,</H2>结尾。)

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

把文本里的电子邮件地址查找出来,全部替换为可点击的链接

Hello,ben@forta.com is my email address.

正则表达式:(\w+[\w\.]*@[\w\.]+\.\w+)

替换文本:<A HREF="maito:$1">$1</A>

替换结果:Hello,<A HREF="maito:ben@forta.com">ben@forta.com</A> is my email address.

注意上面是用:$替换\,JavaScript中要这么替换。还有同一个子表达式可以被引用多次,只要在需要用到它的地方写出它的回溯引用就可以了。
回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里。

把用户数据库里某个字段信息重新排版

313-555-1234
248-555-9999
810-555-9000
正则表达式:(\d{3})(-)(\d{3})(-)(\d{4})
替换:($1)$3-$5
替换结果:
(313)555-1234
(248)555-9999
(810)555-9000

(\d{3})(-)(\d{3})(-)(\d{4})有5个子表达式,只用了其中的1/3/5子表达式。
posted @ 2017-08-15 21:11  永不止步!  阅读(1294)  评论(0编辑  收藏  举报