3.1 匹配多个字符中的某一个
第 2 章介绍的 .
字符可以匹配任意单个个字符。在第 2 章的一个例子里,我们使用了 .a
来匹配 na 和 sa。现在,如果在那份文件清单里增加了一个名为 cal.xls 的文件,而你仍只想找出 na 和 sa,你该怎么办?别忘了, .
也能匹配 c,所以文件名 cal.xls 也会被找出。
既然只想找出 n 和 s,使用可以匹配任意字符的 .
显然不行——我们不需要匹配任意字符,我们只想匹配 n 和 s 这两个字符。在正则表达式里,我们可以使用元字符 [
和 ]
来定义一个字符集合。在使用 [
和 ]
定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。下面这个例子与第 2 章里的最后一个例子相似,但我们在这次的正则表达式里使用了一个字符集合:
例 1
[ns]a.\.xls
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls ca1.xls
分析
这里使用的正则表达式以 [ns]
开头;这个集合将匹配字符 n 或 s(但不匹配字符 c 或其他字符), [
和 ]
不匹配任何字符,它们只负责定义一个字符集合。接下来,正则表达式里的字符 a 将匹配一个 a 字符, .
将匹配一个任意字符, \.
将匹配 .
字符本身,xls 将匹配字符串 x1s。从结果上看,这个模式只匹配了 3 个文件名,与我们的预期完全一致。
虽然结果正确,但模式 [ns]a.\.xls
并不是最正确的答案。如果那份文件清单里面还有一个名为 usa1.xls 的文件,它也会被匹配出来。这里涉及了位置匹配问题,而我们将在第 6 章对此做专题讨论。
正如看到的那样,对正则表达式进行测试是很有技巧的。验证某个模式能不能获得预期的匹配结果并不困难,但如何验证它不会匹配到你不想要的东西可就没有这么简单了。
字符集合在不需要区分字母大小写(或者只须匹配某个特定部分)的搜索操作里比较常见。比如说:
例 2
[Rr]eg[Ee]x
The phrase "regular expression" is often abbreviated as RegEx or regex.
分析
这里使用的模式包含着两个字符集合: [Rr]
负责匹配字母 R 和 r, [Ee]
负责匹配字母 E 和 e。这个模式可以匹配 RegEx 和 regex,但不匹配 REGEX。
如果你打算进行一次不需要区分字母大小写的匹配,不使用这个技巧也能达到目的。这样模式最适合用在从全局看需要区分字母大小写,但在某个局部不需要区分的搜索操作。在本站提供的在线正则表达式工具中可以打开“忽略大小写(i)”选项来全局不区分大小写。