2.2 匹配任意字符
上一节见到的正则表达式都是静态文本,它们根本体现不出正则表达式的威力。下面我们一起来看看如何使用正则表达式去匹配不可预知的字符。
在正则表达式时,特殊字符用来匹配一系列字符集合。 .
字符(英文句号/小数点)可以匹配任何一个单个的字符。
如果你曾经使用过 DOS 的文件搜索功能,你将发现正则表达式里面的 .
字符相当于 DOS 里面的 ?
字符。SQL 用户将注意到 .
字符相当于 SQL 中的 *
字符。
于是,用正则表达式 c.t
进行搜索将匹配到 cat
和 cot
(或其他任何 c 和 t 中间包含一个字符的单词)
例 1
sales.
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
分析
正则表达式“sales.”可以把“sales”后面跟一个字符的文本找出来。 9 行文本里面有 3 行存在和这个模式匹配的文本。
通常用“模式”表示实际的正则表达式。
正则表达式可以用来匹配包含着字符串内容的模式。匹配的并不是整个字符串,而是与某个模式相匹配的字符。即使它们并不是整个字符串的一部分。在上面的例子中,我们使用正则表达式并不能匹配整个 9 行文本,它只是匹配了某些行的一部分。如果你需要把某个正则表达式匹配的结果传到其他代码或应用程序里做进一步处理,就要注意这一点。
.
字符可以匹配任何单个字符、字母、数字、中文甚至是“.”本身。
例 2
sales.
sales.xls sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
分析
这个例子比上一个多了一个“sales.xls”文件。 因为“.”能够匹配任何一个单个字符,所以“正则表达式.md”和“正则表达式.txt”也与模式"正则表达式."相匹配。
在同一个正则表达式里面允许使用多个 .
字符,它们既可以连续出现也可以间隔着出现在模式的不同位置。
例 3
我们再来看一个使用了相同原始文本的例子:把以 na 或 sa 开关的文件找出来。
.a.
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
分析
正则表达式“.a.”把“na1”、“na2”和“sa1”找了出来,但它们同时还找到了 4 个预料之外的匹配结果。
为什么会这样呢?因为我们使用的模式将与第 2 个字符是 a 的任意 3 个字符相匹配。我们真正需要的是后面再紧跟着一个英文句号的".a."的模式。
例 4
我们再来试一次:
.a..
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
分析
.a..
并不比 .a.
也多少;新增加的 .
将匹配任何一个多出来的字符。
既然 .
是一个能够匹配任何一个单个字符的特殊字符,我们怎样才能搜索 .
本身呢?下节说