最后一节关于正则表达式元字符的相关介绍,通过这几篇正则表达式元字符的学习,对正则表达式的认识应该有一个提升。以后在学习或者写正则表达式的时候 要注意是否达到效率最高了。这一大章节的学习,其中某些正则表达式定义并不适用你当前所用的工具中,但是在了解了这些定义后,你能学习到正则表达式还能这样玩, 也是很有趣的。
正则表达式——括号以及反向应用
到目前为止,我们所见过的括号有两种用途:
- 限制多选项的范围
- 将若干字符组合为一个单元,受问好或星号或加号之类的量词的作用。
现在我要介绍的另一种用途,虽然支持这一功能的 egrep 并不多,但在其他工具软件中很常见。
在许多流派的正则表达式中,括号能够"记住"它们包含子表达式匹配的文本。如果我们知道重复单词的第一个单词,就能无误的找到它。例如 /the the/
,这样或许 还是会匹配到"the theory"的情况,但是我们使用单词分界符:/\>the the\</
,这样就解决了这个问题。
穷举所有出现的重复单词显然是不可能完成的任务,如果先匹配任意一个单词,接下来检查"后面的单词是否与它一样",这样就方便多了。如果你当前使用的正则表达式支持 " 反向引用 ",就能这样。
反向引用是正则表达式的特性之一,它容匹配与表达式先前部分匹配同样的样本。
接下来,继续改造之前的那个正则表达式。先把 /\<the\s+the\>/
中第一个"the"替换为能够匹配任意单词的正则表达式 /[A-Za-z]+/
; 然后在两端加上括号;最后把后一个"the"替换为特殊的元字符序列 /\1/
,就得到了 /\<([A-Za-z]+)\s+\1\>/
。
在支持反向引用的工具软件中,括号能够记忆其中子表达式匹配的文本,无论这些文本是什么,元字符序列 /\1/
都能记住。
当然在一个表达式中,我们可以使用多个括号,在使用 /\1 \2 \3/
来表示第一组】第二组、第三组匹配的文本。
正则表达式——转义
在之前涉及到的例子中,我们避开了一个话题,如果需要匹配的某个字符就是元字符,正则表达式该如何处理呢?
比如我需要匹配一个互联网域名"www.helay.net",其中的点号就是元字符,它可以匹配任何字符。正则匹配文本中点号的元序列应该是反斜线加上点号的组合: /www\.helay\.net/
。/\./
称之为" 转义的点号 ",这种办法适用于所有元字符,不过在字符组内部无效。 (注意某些版本的程序语言有特殊的)
这样是使用反斜线称为" 转义符 ",作用就是去除元字符的特殊含义。