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])>.*?</H1> 匹配结果:共找到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子表达式。