黑马程序员-day4-正则表达式之回溯引用

来源:互联网 发布:学而后知不足的下一句 编辑:程序博客网 时间:2024/05/21 17:34

      ------------- Windows phone 手机开发 、ASP .NET培训、期待与您交流!----------------

       最近学习了下正则表达式,觉得它是一门挺强大的技术,如果有人对正则表达式不是很了解,但是想学习它的知识的,我推荐一本好书《正则表达式必知必会》,这本书浅显易懂,适合新手阅读。

       正则表达式起源于1950代在数学领域的一些研究工作。几年之后,计算机领域借鉴那些研究工作的成果和思路开发了Unix世界里的Perl语言和grep等工具程序。在许多年里,正则表达式只流行语Unix平台,但是这种情况早已发生了变化,现在几乎所有的计算机平台都支持正则表达式,只是具体方式和具体程度有差异而已。

讲解一个例子大家就知道回溯引用是什么了,

文本:

<body>

<H1>Welcome to my Homepage</H1>

Content is divied into two sections:<BR>

<H2>ColdFusion</H2>

Information about Macromedia ColdFusion.

<H2>Wireless</H2>

Information ablout Bluetooh,802.11,and more

</body>

正则表达式:<[hH]1>.*</[hH]1>

结果:<H1>Welcome to my Homepage</H1>

分析:模式<[hH]1>.*</[hH]1>只能匹配一级标题

如果用正则表达式:<hH[1-6]>.*?</[hH][1-6]>

结果:<H1>Welcome to my Homepage</H1>

<H2>ColdFusion</H2>

<H2>Wireless</H2>

<H2>Wireless</H2>

分析:<hH[1-6]>匹配任何一级标题的开始标题,</[hH][1-6]>匹配任一标题的结束标签。

现在这个<hH[1-6]>.*?</[hH][1-6]>正则表达式成功了吗?

文本:

<body>

<H1>Welcome to my Homepage</H1>

Content is divied into two sections:<BR>

<H2>ColdFusion</H2>

Information about Macromedia ColdFusion.

<H2>Wireless</H3>

Information ablout Bluetooh,802.11,and more

</body>


正则表达式:<hH[1-6]>.*?</[hH][1-6]>

结果:<H1>Welcome to my Homepage</H1>

<H2>ColdFusion</H2>

<H2>Wireless</H2>

<H2>Wireless</H3>

分析:显然其中一个标题以<H2>开头、以</H3>结尾的,不是一个合法的标题,但是<hH[1-6]>.*?</[hH][1-6]>却匹配了这个标题,要解决这个问题,就只能求助与回溯引用。

假如你有一段文本,你想吧这段文本中连续重复出现的单词找出来。显然,在搜索某个单词,第二次出现时,这个单词必需是已知的。

回溯引用允许正则表达式模式引用前面的匹配结果。

文本:

This is block of text,

Several words here are are

Repeated,and and they

Should not be.

正则表达式:[  ]+(\w+)[  ]+\1

结果:are are 

and and

分析:[ ]+匹配一个或多个空格,\w+匹配一个或多个字母数字字符,\1是一个回溯引用,它引用的正是前面划分出来的那个子表达式

注意:回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式

文本:<body>

<H1>Welcome to my Homepage</H1>

Content is divied into two sections:<BR>

<H2>ColdFusion</H2>

Information about Macromedia ColdFusion.

<H2>Wireless</H3>

Information ablout Bluetooh,802.11,and more

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

结果:<H1>Welcome to my Homepage</H1>

<H2>ColdFusion</H2>

分析:找到了2个匹配,用(和)把[1-6]括起来,使它成为一个子表达式,这样一来,就可以用</[hH]\1>中的\1引用这个子表达式了,子表达式([1-6])匹配数字1-6\1只匹配与之相同的数字。这样<H2>Wireless</H3>就不会被匹配了。

\1到底代表着什么?它代表模式中的第一个子表达式,\2代表着第二个子表达式,\3代表着第三个子表达式,以此类推。

      ------------- Windows phone 手机开发 、ASP .NET培训、期待与您交流!----------------

           

原创粉丝点击