2011年11月6日星期日

正则表达式中的字符组[ ]


正则表达式中的字符组(Character Classes)用"[…]"表示,它容许使用者列出在某处期望匹配的字符。比如我们需要搜索单词"grey",同时又不确定它是否写成了"gray",就可以使用"gr[ea]y"进行匹配。在字符组内部,字符组元字符"-"(连字符)表示一个范围,"[0-9]"和"[a-z]"是常用的匹配数字和小写字母的简便方式。连字符"-"在字符组内部才是元字符,否则它就只能匹配普通的连字符号;即使在字符组内部,它也不一定是元字符,如果连字符出现在字符组的开头,它表示的就只是一个普通字符,而不是一个范围。问号"?"和点号"."在字符组中也是普通字符。

以上在大多数正则表达式的书中都会提到的,但这里忽略了如何在字符组内部使用"方括号"本身。这就是我遇到的问题,被困扰了好几个小时。问题来自一条sed语句:

sed -ne '/^ID_.*=/ {s/[]()|&;<>`'"'"'\\!$" []/\\&/g;p}'

当在字符组中期望匹配方括号时,"[&[]"会匹配"["和"&","[]&]"会匹配"]"和"&",而同时匹配"&","["和"]"必须写成"[]&[]",这就是上面那个例子的情况,注意最外层的方括号才是代表字符组。与之相对应,让人很困惑的是"[[]]"这样的写法,它匹配的是"[]",即左方括号后紧跟一个右方括号。

总结

所以如果要在字符组中包含"["或者"]",必须分别写在字符组的两端,即中间不该包含其他字符,以免被当作是字符组标记。

没有评论:

发表评论