正则表达式-匹配任意字符
匹配任意字符
前面见到的正则表达式都是些静态的纯文本,它们根本体现不出正则表
达式的威力。下面,我们一起来看看如何使用正则表达式去匹配不可预知的
字符。
在正则表达式里,特殊字符(或字符集合)用来给出要搜索的东西。.字
符(英文句号)可以匹配任何一个单个的字符。
提示:如果你曾经使用过DOS的文件搜索功能,你将发现正则表达式里的
.字符相当于DOS的?字符。SQL用户将注意到正则表达式里的.字符相当于SQL中
的_(下划线)字符。
于是,用正则表达式c.t进行的搜索将匹配到cat和cot(还能匹配到一些
毫无意义的单词)。
文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式
sales.
结果
(sales1).xls
orders3.xls
(sales2).xls
(sales3).xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
分析
正则表达式sales.将把由字符串sales和另外一个字符构成的文件名查找出来。
9个文件里有3个与这个模式(pattern)相匹配。
提示:人们常用模式表示实际的正则表达式。
注意:正则表达式可以用来匹配包含着字符串内容的模式。匹配的并不总是整
个字符串,而是与某个模式相匹配的字符——即使它们只是整个字符串的一部分。在
上面的例子里,我们使用的正则表达式并不能匹配整个文件名,它只匹配了文件名的
一部分。如果你需要把某个正则表达式的匹配结果传递到其他代码或应用程序里做进
一部处理,就必须记住这一细节差异。
.字符可以匹配任何单个的字符、字母、数字甚至是.字符本身。
文本
sales.xls
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式
sales.
结果
(sales).xls
(sales1).xls
orders3.xls
(sales2).xls
(sales3).xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
分析
这个例子比上一个多了一个sales.xls文件。因为,能够匹配任何一个
单个的字符,所以这个文件也与模式sales.相匹配。
在同一个正则表达式里允许使用多个.字符,它们既可以连续出现(一
个接着一个——..将匹配任意两个字符),也可以间隔着出现在模式的不同
位置。我们再来看一个使用了相同原始文本的例子:把以na(表示北美)或
sa(表示南美)开头的文件(不管它们后面跟着一个什么数字)找出来。
文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式
.a.
结果
(sal)es1.xls
orders3.xls
(sal)es2.xls
sales3.xls
a(pac)1.xls
europe2.xls
(na1).xls
(na2).xls
(sa1).xls
分析
正则表达式.a.把na1、na2、sa1找了出来,但它同时还找到了4个预料之外的匹配结果
。为什么会这样?因为我们使用的模式将与第2个字符是a的任意3个字符相匹配。
我们真正需要的是后面再紧跟着一个英文句号的.a.的模式。我们再来试一次:
文本
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式
.a..
结果
(sale)s1.xls
orders3.xls
(sale)s2.xls
(sale)s3.xls
a(pac1).xls
europe2.xls
(na1.)xls
(na2.)xls
(sa1.)xls
分析
.a..并不比.a.好多少;新增加的,将匹配任何一个多出来的字符(不管它是什么)
。既然.是一个能够与任何一个单个字符相匹配的特殊字符,我们怎样才能搜索.本身呢?