字符组
待匹配文本:
js
! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9
: ; < = > ? @
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
[ \ ] ^ _ `
a b c d e f g h i j k l m n o p q r s t u v w x y z
{ | } ~
1、字符组取反
对字符组取反的语法之前你已经见过好几次了,这里我就简单介绍一下。对字符组取反会匹配与字符组内容不匹配的字符。比如,如果你不想匹配元音字符,可以这样写:
js
[^aeiou]

该字符组起始位置的脱字符(^)的意义就是:"不,我不想匹配这些字符。"(脱字符必须出现在起始位置。)
2、并集与差集
字符组可以像集合那样操作。事实上,字符组的另一个名称就是字符集(character set)。不是所有的实现程序都支持这项功能,但Java支持该功能。
我将展示一个叫做Reggy的Mac桌面应用程序(参见5.5节)。在其Preference(偏好设置)面板中,我将Regular Expression Syntax(正则表达式语法)改为"Java",而在Font中(在Format里),为了阅读方便,我将字体大小设为24。
如果你想要两个字符组的并集,可以这样做:
js
[0-3[6-9]]
正则表达式处理器会匹配0到3之间的数字或者6到9之间的数字。下图展示了这在Reggy中的结果。

匹配差集(实质上就是减操作):
js
[a-z&&[^m-r]]
这匹配a到z之间的字符,但其中m到r之间的字符除外(如图所示)。

3、POSIX字符组
POSIX(Portable Operating System Interface,可移植操作系统接口)是IEEE维护的一系列标准。其中包含了一个正则表达式标准(ISO/IEC/IEEE 9945:2009),该标准提供了一套命名的字符组,其形式为:
js
[[:xxxx:]]
其中xxxx是名字,比如digit或者word。
其中xxxx是名字,比如digit或者word。
要匹配字母及数字,可以用:
js
[[:alnum:]]
下图展示的是在Rubular中使用字母及数字字符组的情况。

还有一种方法就是只用简写式\w。哪种方法写起来简便,是POSIX字符组还是简写式?当然是字符最少的方法胜出。我承认自己并不常使用POSIX字符组,但是还是有必要了解一下。
对于大写或小写的字母,使用:
js
[[:alpha:]]
如果你想匹配ASCII范围内的字符,则用:
js
[[:ascii:]]
当然,还有对POSIX字符组取反的形式:
js
[[:^xxxx:]]
如果想匹配非字母字符,可以使用:
js
[[:^alpha:]]
要匹配空格或制表符,使用:
js
[[:space:]]
若匹配所有空白字符,则用:
js
[[:blank:]]
还有很多POSIX字符组,如下表示。
