Rumah  >  Artikel  >  hujung hadapan web  >  正则表达式之回溯引用backreference详解_正则表达式

正则表达式之回溯引用backreference详解_正则表达式

微波
微波asal
2017-06-28 13:49:301589semak imbas

这篇文章主要介绍了正则表达式学习教程之回溯引用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

Atas ialah kandungan terperinci 正则表达式之回溯引用backreference详解_正则表达式. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn