这篇文章主要介绍了正则表达式学习教程之回溯引用backreference,结合实例形式详细分析了回溯引用的概念、功能及实现技巧,需要的朋友可以参考下
本文实例讲述了正则表达式回溯引用backreference。分享给大家供大家参考,具体如下:
在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。
一、问题引入
一个在HTML页面中匹配标题标签(H1—H6)的问题:
文本:
<body> <h1>Welcome to my page</H1> Content is pided into twosections:<br> <h2>Introduction</h2> Information about me. <H2>Hobby</H2> Information about my hobby. <h2>This is invalid HTML</h3> </body>
正则表达式:bec64cdfd3b18ddf17d11124d921cd9d.*?c0d08c9e09935101747a568bd8607d7d
结果:
6c04bd5ca3fcae76e30b72ad730ca86d
【4a249f0d628e2318394fd9b75b4636b1Welcome to my page921186cad5e55f1481a45fdcd6c30f6e】
Content is pided into twosections:0c6dc11e160d3b678d68754cc175188a
【c1a436a314ed609750bd7c7d319db4daIntroduction2e9b454fa8428549ca2e64dfac4625cd】
Information about me.
【1b7994ba0f794e1b49742a6367e9e0c6Hobbyebe8950f0835d9653ff486769499854f】
Information about my hobby.
【c1a436a314ed609750bd7c7d319db4daThis is invalid HTML39528cedfa926ea0c01e69ef5b2ea9b0】
36cc49f0c466276486e50c850b7e4956
分析:模式bec64cdfd3b18ddf17d11124d921cd9d匹配任何一级标题的开始标签,而且不区分大小写,在这个例子中它匹配到了4a249f0d628e2318394fd9b75b4636b1、c1a436a314ed609750bd7c7d319db4da,c0d08c9e09935101747a568bd8607d7d匹配到了473f0a7621bec819994bb5020d29372a、2e9b454fa8428549ca2e64dfac4625cd、39528cedfa926ea0c01e69ef5b2ea9b0;这里使用了懒惰型元字符来匹配标签中的文本,否则会匹配到从第一个开始标签到最后一下结束标签之间的内容。但是从结果可以看出,有一个无效的标签也匹配上了,即c1a436a314ed609750bd7c7d319db4da39528cedfa926ea0c01e69ef5b2ea9b0,它们根本不能配对。要解决这个问题,就需要使用到回溯引用(backreference)。
二、回溯引用匹配
回溯引用是指模式的后半部分引用在前半部分中定义的子表达式。至于子表达式的使用、划分和引用,在前面已经介绍过了。现在来解决前面的例子:
文本:
<body> <h1>Welcome to my page</H1> Content is pided into twosections:<br> <h2>Introduction</h2> Information about me. <H2>Hobby</H2> Information about my hobby. <h2>This is invalid HTML</h3> </body>
正则表达式:2b0cba08e60dd5488139acd8c53df8f7.*?24c90dc245630ca7407a2a63769febbf
结果:
6c04bd5ca3fcae76e30b72ad730ca86d
【4a249f0d628e2318394fd9b75b4636b1Welcome to my page921186cad5e55f1481a45fdcd6c30f6e】
Content is pided into twosections:0c6dc11e160d3b678d68754cc175188a
【c1a436a314ed609750bd7c7d319db4daIntroduction2e9b454fa8428549ca2e64dfac4625cd】
Information about me.
【1b7994ba0f794e1b49742a6367e9e0c6Hobbyebe8950f0835d9653ff486769499854f】
Information about my hobby.
c1a436a314ed609750bd7c7d319db4daThis is invalid HTML39528cedfa926ea0c01e69ef5b2ea9b0
分析:首先匹配开始标题标签的模式2b0cba08e60dd5488139acd8c53df8f7,使用括号把[1-6]做为子表达式,而匹配结束标题标签模式为24c90dc245630ca7407a2a63769febbf,其中\1表示引用第一个子表达式,即([1-6]),如果([1-6])匹配到的是1,那\1也匹配到1,如果匹配到2,那\1也匹配到2,所以最后一个无效的标题标签就不会被匹配到了。
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
以上是正则表达式之回溯引用backreference详解_正则表达式的详细内容。更多信息请关注PHP中文网其他相关文章!