正则表达式字符集探究
正则表达式字符集是什么呢?我们在使用正则表达式的时候,正则表达式字符集起到什么作用呢?那么这里就向你介绍一下正则表达式字符集的概念以及所包含的具体的方法和使用。
正则表达式字符集是由一对方括号“[]”括起来的正则表达式字符集合。使用正则表达式字符集,你可以告诉正则表达式引擎仅仅匹配多个字符中的一个。如果你想匹配一个“a”或一个“e”,使用[ae]。你可以使用gr[ae]y匹配gray或grey。这在你不确定你要搜索的字符是采用美国英语还是英国英语时特别有用。相反,gr[ae]y将不会匹配graay或graey。正则表达式字符集中的字符顺序并没有什么关系,结果都是相同的。
你可以使用连字符“-”定义一个字符范围作为正则表达式字符集。[0-9]匹配0到9之间的单个数字。你可以使用不止一个范围。[0-9a-fA-F] 匹配单个的十六进制数字,并且大小写不敏感。你也可以结合范围定义与单个字符定义。[0-9a-fxA-FX]匹配一个十六进制数字或字母X。再次强调一下,字符和范围定义的先后顺序对结果没有影响。
◆正则表达式字符集的一些应用
查找一个可能有拼写错误的单词,比如sep[ae]r[ae]te 或 li[cs]en[cs]e。
查找程序语言的标识符,A-Za-z_][A-Za-z_0-9]*。(*表示重复0或多次)
查找C风格的十六进制数0[xX][A-Fa-f0-9]+。(+表示重复一次或多次)
◆取反正则表达式字符集
在左方括号“[”后面紧跟一个尖括号“^”,将会对正则表达式字符集取反。结果是正则表达式字符集将匹配任何不在方括号中的字符。不像“.”,取反正则表达式字符集是可以匹配回车换行符的。
需要记住的很重要的一点是,取反正则表达式字符集必须要匹配一个字符。q[^u]并不意味着:匹配一个q,后面没有u跟着。它意味着:匹配一个q,后面跟着一个不是u的字符。所以它不会匹配“Iraq”中的q,而会匹配“Iraq is a country”中的q和一个空格符。事实上,空格符是匹配中的一部分,因为它是一个“不是u的字符”。
如果你只想匹配一个q,条件是q后面有一个不是u的字符,我们可以用后面将讲到的向前查看来解决。
◆正则表达式字符集中的元字符
需要注意的是,在正则表达式字符集中只有4个 字符具有特殊含义。它们是:“] \ ^ -”。“]”代表正则表达式字符集定义的结束;“\”代表转义;“^”代表取反;“-”代表范围定义。其他常见的元字符在正则表达式字符集定义内部都是正常字符,不需要转义。例如,要搜索星号*或加号+,你可以用[+*]。当然,如果你对那些通常的元字符进行转义,你的正则表达式一样会工作得很好,但是这会降低可读性。
在正则表达式字符集定义中为了将反斜杠“\”作为一个文字字符而非特殊含义的字符,你需要用另一个反斜杠对它进行转义。[\\x]将会匹配一个反斜杠和一个X。“]^-”都可以用反斜杠进行转义,或者将他们放在一个不可能使用到他们特殊含义的位置。我们推荐后者,因为这样可以增加可读性。比如对于字符“^”,将它放在除了左括号“[”后面的位置,使用的都是文字字符含义而非取反含义。如[x^]会匹配一个x或^。[]x]会匹配一个“]”或“x”。[-x]或[x-]都会匹配一个“-”或“x”。
◆正则表达式字符集的简写
因为一些正则表达式字符集非常常用,所以有一些简写方式。
\d代表[0-9];
\w代表单词字符。这个是随正则表达式实现的不同而有些差异。绝大多数的正则表达式实现的单词正则表达式字符集都包含了A-Za-z0-9_]。
\s代表“白字符”。这个也是和不同的实现有关的。在绝大多数的实现中,都包含了空格符和Tab符,以及回车换行符\r\n。
正则表达式字符集的缩写形式可以用在方括号之内或之外。\s\d匹配一个白字符后面紧跟一个数字。[\s\d]匹配单个白字符或数字。[\da-fA-F]将匹配一个十六进制数字。
取反正则表达式字符集的简写
[\S] = [^\s] [\W] = [^\w] [\D] = [^\d]
◆正则表达式字符集的重复
如果你用“?*+”操作符来重复一个正则表达式字符集,你将会重复整个正则表达式字符集。而不仅是它匹配的那个字符。正则表达式[0-9]+会匹配837以及222。