正则表达式是高效,强大,便捷的文本处理工具,本身,再加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和分析文本的能
力。配合上特定语言工具提供的额外支持,正则表达式能够添加,删除,分离,叠加,插入,和休整各种类型的文本和数据。
正则表达式的组成
完整的正则表达式由两种字符构成:特殊字符(special characters,如通配符*),称为“元字符”;其他为“文字”(literal),或称普通文本字符(normal text characters)。
行起始和结束(位置匹配)
在检查一行文本时,"^" 代表一行的开始, "$" 代表结束。如,“cat” 寻找的是一行文本中的任意位置的 “cat”,但是 “^cat” 只寻找行首的 cat, "^"用来把匹配文本
(这个表达式的其他部分匹配的字符)“锚定”在这一行的开头。同样,“cat$”之寻找位于行末的 cat,如 scat,以cat结尾的行。
^cat 匹配以 cat 开头的行 //错误
^cat 匹配以 c 作为一行的第一个字符,紧接着一个 a , 再紧接着 t 的文本。 //正确
注:要养成按照字符理解正则表达式的习惯。脱字符和美元符号的特别之处在于,他们匹配的是一个“位置”,而不是具体文本。
匹配若干字符之一(文本匹配)
如过,我们想匹配单词,如“grey”,同时又不确定它是否写作“gray”,就可以使用正则表达式结构体(construct)"[……]"。它容许使用者列出在某处期望匹配的字符,>通常被称为字符组(characters class)。"e" 匹配 e,"a" 匹配 a, "[ea]" 匹配 e 或 a。
"gr[ea]y": 先找到 g,跟着是一个r,然后是一个 a 或者 e,最后是一个y。
注:"[Ss]mith" 单词首字母大小写的情况需注意,这个表达式,仍然可以匹配内嵌在单词里的smith或Smith,如blacksmith。
请注意,在字符组以外,普通字符,都有“接下来是(and then)” 的意思,“gr[ae]y"——"首先匹配 g,接下来是 r ……"。这与字符组内部的情况正好相反。字符组的内容
是在同一个位置能够匹配的若干字符,所以它的意思是“或”。
在一个字符组中可以列举多个字符。如[123456],匹配 1 到 6 中的任意一个数字。在字符组内部,字符组元字符(character-class metacharacter)"-"(连字符)表示>一个范围。如[0-9],[a-z]等,表示匹 配0 到 9中的任意一个数字,a 到 z 中的任意一个小写字母。和一一列举表单的意思是一样的。“[0-9a-fA-F],[A-Fa-f0-9]”用来匹配>十六进制数字,顺序无所谓。除此外,可以随心所欲把字符范围与普通字符相结合,如“[0-9A-z_!.?]”,能够匹配一个数字,大写字母,下划线,惊叹号,点号,或者问号。
注:只有在字符组内部,“-” 连字符才是元字符,否则它只能匹配普通连字符号。实际,即使在字符组内部,若它出现在字符组的开头,它也不是元字符,只是一个普通
字符“—”,而不是表示一个范围。同样的道理,问号,和点号通常也被当做元字符,但是在字符粗内,则不是。
排除型字符组(文本匹配)
"[^……]",这个字符组会匹配任何未列出的字符。如"[^1-6]",匹配除1到6外的任何字符。字符组开头的"^",表示排除,这里列出不希望匹配的字符。
注:排除型字符组,表示“匹配一个未列出的字符”,而不是 “不要匹配列出的字符”。两种说法看似一样,但略有差异。有一种简单的理解排除型字符组的办法,就是把>他们看做普通字符组,里面包含的是除了“排除型字符组中所有字符”以外的字符。
egrep 'q[^u]' word.list
"q[^u]" 可以匹配到,Iraqi,qoph,miqra等,无法匹配到 Iraq,Qantas 。原因,正则要求的是 小写 q,而 Qantas是 大写Q 所以无法匹配,若用Q[^u]则可以。无法匹>配到Iraq,原因是, 正则要求q之后紧跟一个u以外的字符,这就排除了q在行尾的情况。通常,行尾会存在一个换行符,但是egrep会在检查正则表达式之前,去掉换行符,>所以行尾的q之后,没有有除u之外的其他字符。故无法匹配。
注:一个字符组,即使是排除型字符组,也需要匹配一个字符。(Iraq 无法匹配的原因,q后没有字符,和'q[^u]',先匹配 q, 再匹配一个非u的字符,不符。)
用点号匹配任意字符(文本匹配)

最低0.47元/天 解锁文章
696

被折叠的 条评论
为什么被折叠?



