3.2 利用字符集合区间
我们再来仔细看看那个从一份文件清单里找出特定文件的例子。我们刚才使用的模式 [ns]a.\.xls
还存在着另外一个问题。如果那份文件清单里有一个名为 sam.xls 的文件,结果会怎样?显然,因为 .
可以匹配所有的字符而不是仅限于数字,所以文件 sam. xls 也会出现在匹配结果里。这个问题可以用一个如下所示的字符集合来解決:
例 1
[ns]a[0123456789]\.xls
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls ca1.xls
分析
在这个例子里,我们改用了另外一个模式,这个模式的匹配对象是:第 1 个字符必须是 n 或 s,第 2 个字符必须是 a,第 3 个字符可以是任何一个数宇(因为我们使用了字符集合 [0123456789]
)。注意,文件名 sam.xls 没有出现在匹配结果里,这是因为 m 与我们给定的字符集合 (10 个数字)不相匹配。
在使用正则表达式的时候,会频繁地用到一些字符区间(0~9、A~Z,等等)。为了简化字符区间的定义,正则表达式提供了一个特殊的元字符字符区间可以用 -
(连字符)来定义。下面还是刚才那个例子,但我们这次使用了一个字符区间:
例 2
[ns]a[0-9]\.xls
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls ca1.xls
分析
模式 [0-9]
的功能与 [0123456789]
完全等价,所以这次的几配结果与刚才那个例子完全一样。字符区间并不仅限于数字,以下这些都是合法的字符区间:
A-Z
,匹配从 A 到 Z 的所有大写字母。a-z
,匹配从 a 到 z 的所有小写字母。A-F
,匹配从 A 到 F 的所有大写字母。A-z
,匹配从 ASCII 字符 A 到 ASCII 字符 z 的所有字母。这个模式一般不常用,因为它还包含着[和^t 等在 ASCII 字符表时排列在 Z 和 a 之间的字符
字符区间的首、尾字符可以是 ASCII 字符表里的任意字符。但在实际工作中,最常用的字符区间还是数字字符区间和字母字符区间。
在定义一个字符区间的时候,一定要避免让这个区间的尾字符小于它的首字符(例如 [3-1]
)。这种区间是没有意义的,而且往往会让整个模式失效。
-
(连字符)是一个特殊的元字符,作为元字符它只能用在 [
和 ]
之间。在字符集合以外的地方, -
只是一个普通字符,只能与“-”本身相匹配。因此,在正则表达式里, -
字符不需要被转义。
在同一个字符集合里可以给出多个字符区间。比如说,下面这个模式可以匹配任何一个字母(无论大小写)或数字,但除此以外的其他字符(既不是数字也不是字母的字符)都不匹配:
[A-Za-z0-9]
这个模式是下面这个字符集合的简写形式:
[ABCDEFGHIJKLKMOPQRSTUVWXYZabcdefghijklkmopqrstuvwxyz0123456789]
正如大家看到的那样,字符范围使得正则表达式语法变得非常简明。
下面是另一个例子,这次要查找的是 RGB 值(用一个十六进制数字给出的红、绿、蓝三基色的组合值,计算机可以根据 RGB 值把有关的文字或图象显示为由这三种颜色按给定比例调和出来的色彩)。在网页里,RGB 值是 以#000000(黑色)#FFFFFF(白色)、#FF0000(红色)的形式给出的。RGB 值用大写或小写字母给出均可,所以#FFOOff (品红色)也是合法的 RGB 值。下面就是这个例子:
匹配 16 进制颜色值
#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]
body { background-color: #336633; color: #ffffff; margin: 0; padding: 0; box-sizing: border-box; }
分析
这里使用的模式以普通字符 #
开头,随后是 6 个同样的 [0-9A-fa-f]
集合。这将匹配一个由字符#开头,然后是 6 个数字或字母 A 到 F(不区分大小写)的字符串。
#号后面跟 6 个 [0-9A-Fa-f]
还是比较冗杂,可以使用更简明的模式,我们后面会讲到。
匹配中文
利用字符集合区间还可以用来匹配 Unicode 编码范围,比如中文,看下面这个例子,使用 [\u4e00-\u9fd5]
可以匹配文本中所有的中文字符
[\u4e00-\u9fd5]
大家好,我是何方(HeFang)。欢迎来到正则表达式系列教程。更多内容请访问的何方的个人小站https://iamhefang.cn
分析
在 Unicode 编码里面 \u4e00
到 \u9fd5
表示中文。
匹配特殊字符
和匹配中文一样,还可以匹配一些特殊字符的集合区间,看下面的例子。
[\u249c-\u24e9]
⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
分析
\u249c
到\u24b5
是带括号的小写字母\u24b6
到\u24cf
是大写的带圈字母\u24d0
到\u24e9
是小写的带圈字母