------------- 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培训、期待与您交流!----------------