跳到主要内容

4.3 匹配特定的字符类别

到目前为止,我们已经学习了如何匹配特定的字符、如何使用点字符 . 匹配任意单个字符、如何使用方括号 [] 匹配多个字符中的某一个、以及如何进行取非 ^ 匹配。

字符集合(匹配多个字符中的某一个)是最常见的匹配形式,而一些常用的字符集合可以用特殊元字符来代替。这些元字符匹配的是某一类别的字符,一般称之为“字符类”或"类元字符"。类元字符并不是必不可少的东西(你总是可以通过逐一列举有关字符或是通过定义一个字符区间的办法来匹配某一类字符),但用它们构造出来的正则表达式简明易懂,在实践中很有用。

注意

下面列出的字符类都是最基本的,几乎所有的正则表达式实现都支持它们。

4.3.1 匹配数字与非数字

我们在第三章学过, [0-9][0123456789] 的简写形式,它可以用来匹配任何一个数字。如果你想匹配的是除数字以外的其他东西,那么把这个集合‘反’〞过来写成 [^0-9] 就行了。下表列出了用来匹配数字和非数字的类元字符。

元字符说明
\d任何一个数字字符(等价于 [0-9]
\D任何一个非数字字符(等价于 [^0-9]

为了演示这些元字符的用法,我们来看一个在前面见过的例子:

myArray\[\d\]
在工具中查看
let myArray = new Array();
...
if (myArray[0] == 0) {
...
}

分析

\[ 匹配 "[", \d 匹配任意单个数字字符, \] 匹配 "]",所以 myArray\[\d\] 匹配出 "myArray[0]"。 myArray\[\d\]myArray\[[0-9]\] 的简写形式,而后者又是 myArray\[[0123456789]\] 的简写形式。这个正则表达式还可以匹配 "myArray[1]"、"myArray[2]",等等(但不匹配 "myArray[10]")。

提示

正如大家看到的那样,在与正则表达式打交道的时候,同样的问题几乎总是有好几种不同的解决办法。这些办法并无优劣之分,你尽可以选择最熟悉的那种语法。

警告

正则表达式的语法是区分字母大小写的。 \d 匹配数字, \D\d 的含义刚好相反。接下来将看到的其他类元字符也是如此。

4.3.2 匹配字母和数字与非字母和非数字

字母 A 到 Z(不分大小写)、数字 0 到 9、再加上下划线字符(_)——是另一种比较常用的字符集合;这些字符常见于各种名字里,如(文件名、子目录名、变量名、数据库对象名,等等)。下表列出了用来匹配字母数字和非字母数字的类元字符。

元字符说明
\w任何一个字母数字字符(不区分大小写)或下划线字符(等价于 [a-zA-Z0-9_]
\W任何一下非字母数字或非下划线字符(等价于 [^a-zA-Z0-9_]

看下面这个例子:

\w\d\w\d\w\d
在工具中查看
10101
A1B2C4
21212
E5F6G7
32323

分析

在这个模式里,交替出现的\w 和\d 元字符使得匹配结果时只包含待匹配文本里面的第 2 和第 4 行。

注意

在上面这个例子里,我们使用的正则表达式解决了我们的问题。但它正确吗?请大家思考一下,为什么 1、3、5 行没有被匹配出来?是因为它们只由数字构成、还是因为什么其他原因?

我们将不给出这个问题的答案,理由很简单——例子里的模式解决了问题。这里的关键是正则表达式很少有对错之分(当然,前提是它们能解决问题),我们更关心的是它们的复杂程度——而这要由模式匹配操作的精确程度来决定;如果你需要更精确的匹配,就需要构造更复杂的正则表达式。

4.3.3 匹配空白字符与非空白字符

另一种常见的字符类别是空白字符。在本章前面的内容里,我们向大家介绍了一些用来匹配某个特定的空白字符的元字符。下表列出了用来匹配所有空白字符的类元字符。

元字符说明
\s任何一个空白字符(等价于 [\f\n\r\t\v] )
\S任何一个非空白字符(等价于 [^\f\n\r\t\v] )
注意

用来匹配退格字符的 \b 元字符是一个特例:它不在类元字符 \s 的覆盖范围内,也不在类元字符 \S 的覆盖范围内。

4.3.4 匹配十六进制或八进制数值

你或许不会遇到需要通过某个特定字符的十六进制值或八进制值来匹配它的情况,但我们希望大家明白这是可以做到的。

1.使用十六进制值

在正则表达式里,十六进制(逢 16 进 1)数值要用前缀 \x 来给出。比如说, \x0A 对应于 ASCII 字符 10(换行符),其效果等价于 \n

2.使用八进制值

在正则表达式里,八进制(逢 8 进 1)数值要用前缀 \0 来给出,数值本身可以是两位或三位数字。比如说, \011 对应于 ASCII 字符 9(制表符),其效果等价于 \t

注意

有不少正则表达式实现还允许使用 \c 前缀来指定各种控制字符。比如说, \cZ 将匹配 "Ctrl-Z"。不过,在实际工作中,必须使用这种语法的情况相当少见。

4.3.5 Unicode 属性转义

使用 \p\P 可进行属性转义,用以匹配不同语言的字符。我把相关内容整理成为单独一章,放在4.4 Unicode 属性转义进行讲解。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第四章-使用元字符/4.3-匹配特定的字符类别