正则表达式
正则表达式(regular expression)定义了由一个或多个字符串组成的集合。简单字符串也是正则表达式,它定义了由该字符串自身组成的集合。复杂的正则表达式使用字母、数字和特殊字符来定义不同的字符串。正则表达式“匹配”它定义的任何字符串。
本附录描述了ed 、vim 、emacs 、grep 、awk/mawk/gawk 、sed 、Perl 等实用程序使用的正则表达式。关于Perl 正则表达式的更多信息参见11.7节。这些表达式与shell 的模糊文件引用中使用的正则表达式(参见5.4节)不同。
本附录要点:
● 字符 ● 分隔符 ● 简单字符串 ● 特殊字符 ● 规则 ● 括号表达式 ● 替换字符串 ● 扩展的正则表达式
附录A
第Ⅵ部分附录
774
A1 字符
本附录使用的字符是除换行符之外的其他任意字符。正则表达式中的大多数字符代表它们自身,而那些不代表自身的字符称为特殊字符,也称为元字符。如果需要使用特殊字符代表自身,就需要将这些字符转义(参见A4.5节)。
A2 分隔符
分隔符指标志正则表达式开始和结束的字符。正则表达式的分隔符通常是一个特殊字符,即,该字符不代表它自身而是标志表达式的开始和结束。尽管vim允许使用其他分隔符而grep不使用任何分隔符,但是本附录中的正则表达式使用向前的斜杠(/)作为分隔符,在不存在多义性的情况下,不需要第2个分隔符。例如,当第2个分隔符后面要紧跟回车符时,就可以省略第2个分隔符。
A3 简单字符串
最基本的正则表达式是不包含除分隔符外的特殊字符的简单字符串。简单字符串只与自身匹配(如表A-1所示)。在本附录的示例中,匹配的字符串都带有下划线,例如,look like this。
表A-1 简单字符串
正则表达式匹配的字符串示例
/ring/ ring ring、spring、ringing、stringing
/Thursday/ Thursday Thursday、Thursday's
not、poor nothing /or not/ or not or
A4 特殊字符
在正则表达式中使用特殊字符可以使得正则表达式匹配多个字符串。包含特殊字符的正则表达式总是尽可能匹配最长的字符串,即从文本行的开始(左端)尽可能地向前匹配。
A4.1 句点
句点(.)可以与任何字符匹配(如表A-2所示)。
表A-2 句点
正则表达式匹配字符串示例
will talk、may balk
/ .alk/ 与空格和后面的一个任意字符以及alk
匹配的所有字符串
/.ing/ 匹配由ing和前面的任意字符组成的所
sing song、ping、before inglenook
有字符串
附录A 正则表达式775 A4.2 方括号
方括号([ ])用来定义一个字符类1,该类与方括号内的任意单个字符匹配(如表A-3所示)。如果左方括号后面的第1个字符是脱字符(^),则方括号定义的字符类与不在方括号内的任意其他单个字符匹配。使用连字符可以指定字符的范围。在字符类的定义中,下面几节使用的反斜杠和星号都失去了它们的特殊意义。右方括号(作为字符类的一个成员出现)可以紧跟在左方括号后。脱字符只有紧跟在左方括号后才具有特殊意义;美元符号只有后面紧接右方括号时才具有特殊意义。
表A-3 方括号
正则表达式匹配的字符串示例
/[bB]ill/ 与bill和Bill字符串匹配 bill、Bill、billed
talkative、stink、teak、tanker /t[aeiou].k/ 与t和后面的小写元音字母以及任意字符和k组成的字
符串匹配
/# [6-9]/ 与#和后面的空格以及6 ~ 9之间的任意一个数字组成的
# 60、# 8:、get # 9
字符串匹配
/[^a-zA-Z]/ 与26个字母之外的任意字符(仅限于ASCII字符集)匹配1、7、@、.、}、Stop!
A4.3 星号
星号跟随在代表某个字符的正则表达式(如表A-4所示)之后,表示与该正则表达式匹配字符的0个或多个字符串。跟在句点后的星号可以匹配任意字符串(因为句点可以匹配任意字符,而星号可以匹配前面出现的正则表达式的0个或多个字符串)。星号后面的字符类定义可以匹配属于该类定义的成员字符的任意字符串。
表A-4 星号
正则表达式匹配的字符串示例
/
ab*c/ 与字母a后跟0个或多个b再跟1个c的字符串匹配 ac、abc、abbc、debbcaabbbc /ab.*c/ 与ab后跟0个或多个字符再跟1个c的字符串匹配 abc、abxc、ab45c、
xab a756.345 x cat /t.*ing/ 与t后跟0个或多个字符再跟ing的字符串匹配 thing、ting、I thought of going /[a-zA-Z]*/ 与仅由字母和空格组成的字符串匹配 1. any string without numbers or
punctuation!
/(.*)/ 与圆括号括起来的最长的字符串匹配Get (this) and (that)
/([^])*)/ 与圆括号括起来的最短的字符串匹配 (this)、Get (this and that)
1. .GNU文档中把这些列表运算符和定义字符类的运算符称为表达式,该表达式与预定义的一组字符匹配,如所有数
字(如表15-37所示)。
第Ⅵ部分附录
776
A4.4 脱字符与美元符号
以脱字符(^)开始的正则表达式只能匹配位于行首的字符串。类似地,以美元符号($)结尾的正则表达式只能匹配行末尾的字符串。脱字符和美元符号称为锚点(anchor),因为它们使得匹配固定在行首或行尾(如表A-5所示)。
表A-5 脱字符与美元符号
正则表达式匹配的字符串示例
/^T/ 与位于行首的T匹配
regex匹配
ln Time
/^+[0-9]/ 与位于行首且由加号和后面的一个数字组
成的字符串匹配+5 +45.72、
+759
/:$/ 与位于行尾的冒号匹配 ...below:
A4.5 转义特殊字符
在特殊字符前面使用反斜杠可以转义除数字和圆括号(在Perl中除外)外的特殊字符(如表A-6所示)。转义后的特殊字符代表它自身。
表A-6 转义的特殊字符
正则表达式匹配的字符串示例
/end\./ 与包含end和后面的一个句点的所有字符
串匹配
The end.、send.、pretend.mail /\\/ 与单独的一个反斜杠匹配\
/\*/ 与星号匹配*c、an asterisk(*)
/\[5\]/ [5] it was five [5]
/and\/or/ and/or and/or
A5 规则
下面是应用正则表达式的一些规则。
A5.1 最长匹配
正则表达式总是尽可能匹配最长的字符串,从行首尽可能地向前匹配。Perl把这类匹配称为贪婪匹配。例如,对于下面的字符串:
附录A 正则表达式777
This (rug) is not what it once was (a long time ago), is it?
表达式/Th.*is/与下面的字符串匹配:
This (rug) is not what it once was (a long time ago), is
表达式/(.*)/与下面的字符串匹配:
(rug) is not what it once was (a long time ago)
而表达式/([^)]*)/与下面的字符串匹配:
(rug)
然而,对于下面的字符串:
singing songs, singing more and more
表达式/s.*ing/与下面的字符串匹配:
singing songs, singing
表达式/s.*ing song/与下面的字符串匹配:
singing song
A5.2 空正则表达式
对于某些实用程序(如vim和less,但对grep实用程序不适用),空正则表达式代表最后一次使用的表达式。例如,在vim中使用下面的替换命令:
:s/mike/robert/
如果要再次使用该替换,就可以使用下面的命令:
:s//robert/
或者使用如下命令首先查字符串mike,然后进行替换:
/mike/
:s//robert/
其中的空正则表达式(//)代表最后一次使用的正则表达式(/mike/)。
A6 括号表达式
使用转义圆括号“\(”和“\)”可以将正则表达式括起来(但Perl使用未转义的圆括号将正则表达式括起来)。A7.2节将介绍括号正则表达式匹配的字符串。正则表达式并不试图匹配转义的圆括号,因此带有转义圆括号的正则表达式与没有该圆括号时的正则表达式匹配的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论