正则表达式的字符集合通常用来指定一组必须匹配其中之一的字符,但有时需要反过来做,这就是
取非匹配 , 用元字符 ^ 可以实现对一个字符集合进行取非匹配
一个示例
文本 sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls sam.xls na1.xls na2.xls sa1.xls ca1.xls
正则表达式 [ns]a[^0-9]\.xls
结果 只有 sam.xls
这里[^0-9] 匹配的是任何不是数字的字符, ^的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在 ^ 字符后面的那一个字符或字符区间
下面介绍元字符,先看一个简单的例子
原始文本是一个包含着反斜杠(\)字符的文件路径(用于DOS和Windows 路径),现在想在Linux或Unix 系统中使用这个系统,也就是说要把路径中的反斜杠\ 全部替换为正斜杠/
文本 \home\ben\sales\
正则表达式 \\
结果 \home\ben\sales\
如果只写一个\作正则表达式,将会出错! 这是因为正则表达式分析器会认为你的正则表达式不完整,在一个完整的正则表达式里,字符\的后面永远跟着一个字符
一 匹配空白字符
在进行正则表达式搜索的时候,经常会遇到需要对原始文本里的非打印空白字符进行匹配的情况,以下列出特殊元字符
空白元字符
——————————————————————————
元字符 说明
______________________________________________________________________
[\b] 回退(并删除)一个字符(Backspace键)
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
看一个例子
文本 "101","Ben","Forta"
"102","Jim","James"
"103","Roberta","Robertson"
"104","Bob","Bobson"
正则表达式 \r\n\r\n
结果 "101","Ben","Forta"
"102","Jim","James"
"103","Roberta","Robertson"
"104","Bob","Bobson"
\r\n匹配一个"回车+换行" 组合,有许多操作系统(比如Windows) 都把这个组合做为文本行的结束标签
注: \r\n 是Windows 所使用的文本行结束标签。Unix 和Linux系统只使用一个换行符来结束一个文本行;换句话说,在Unix/Linux系统上匹配空白行只使用\n\n即可,不需要加上\r.
同时适用于Windows 和 Unix\Linux 系统的正则表达式应该包含一个可选的 \r 和一个必须被匹配的 \n
二 匹配特定的字符类别
字符集合(匹配多个字符中的某一个)是最常见的匹配形式,而一些常用的字符集合可以用特殊元字符来代替。这些元字符匹配的是某一类别的字符,称之为 字符类
以下列举几种基本的字符类
1 匹配数字(与非数字)
______________________________________________________
元字符 说明
\d 任何一个数字字符(等价于[0-9])
\D 任何一个非数字字符(等价于[^0-9])
______________________________________________________
\d 是[0-9]的简写形式,[0-9] 又是[0123456789]的简写形式
2 匹配字母与数字
字母和数字,A-Z(不分大小写),0-9,下划线_是一种常用的字符集合,常用于各种文件名、目录名、变量名、数据库对象名等
字母数字元字符
____________________________________________________________
元字符 说 明
\w 任何一个字母数字字符(大小写均可) 或下划线字符,等价于[a-zA-Z0-9_]
\W 任何一个非字母数字或非下划线字符,等价于[^a-zA-Z0-9_]
____________________________________________________________
3 匹配空白字符与非空白字符
空白字符元字符
____________________________________________________________
元字符 说明
\s 任何一个空白字符, 等价于[\f\n\r\t\v]
\S 任何一个非空白字符, 等价于[^\f\n\r\t\v]
注意: 用来匹配退格字符的[\b] 元字符是一个特例: 它不在类元字符\s 的范围,当然也没有被排除在类元字符\S的范围外
4 匹配十六进制或八进制数值
a 十六进制,在正则表达式里,十六进制要用前缀\x 表示 ,如 \x0A对应ASCII字符10(换行符), 其效果等价于\n
b 八进制要用前缀\0表示, 如\011对应ASCII 字符9(制表符), 等价于\t
5 使用POSIX 字符类
________________________________________________________________
字符类 说 明
[:alnum:] 任何一个字母或数字,等价于[a-zA-Z0-9]
[:alpha:] 任何一个字母,等价于[a-zA-Z]
[:blank:] 空格或制表符,等价于[\t ]
[:cntrl:] ASCII 控制字符,(ASCII 0 到 31,再加上ASCII 127)
[:digit:] 任何一个数字,等价于[0-9]
[:graph:] 和[:print:]一样,但不包括空格
[:lower:] 任何一个小写字母, 等价于[a-z]
[:print:] 任何一个可打印字符
[:punct:] 既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符
[:space:] 任何一个空白字符, 包括空格(等价于[^\f\n\r\t\v]
[:upper:] 任何一个大写字母(等价于[A-Z])
[:xdigit:] 任何一个十六进制数字(等价于[a-fA-F0-9])
下面一个示例,演示POSIX字符类的用法,利用正则表达式从一段HTML代码里把RGB值查找出来
<body bgcolor="#336633" text="#FFFFFF" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">
正则表达式 #[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]
结果 <body bgcolor="#336633" text="#FFFFFF" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">
注意: 使用POSIX 字符类必须以[[开头,]]结束( 两对方括号),POSIX 必须在[:和:]之间, 外层的[和]用来定义一个字符集合,内层的[和]字符是POSIX字符类本身的组成部分