日期:2010-06-08  浏览次数:20421 次

  by Jim Hollenhorst  译 寒带鱼

  你是否曾经想过正则表达式是什么,怎样能够快速得到对它的一个基本的认识?我的目的就是在30分钟内带你入门并且对正则表达式有一个基本的理解。事实是正则表达式并没有它看起来那么复杂。学习它最好的办法就是开始写正则表达式并且不断实践。在最初的30分钟之后,你就应该知道一些基本的结构并且有能力在你的程序或者web页面中设计和使用正则表达式了。对那些想要深入研究的人,现在已经有很多非常好的可用资源来让你更深入的学习。

  到底什么是正则表达式?

  我相信你对模式匹配的“计算机通配符”字符应该比较熟悉了。例如,如果你想要在一个Windows文件夹中找到所有Mircosoft Word文件,你要搜索“*.doc”,因为你知道星号会被解释为一个通配符,它匹配所有序列的字符串。正则表达式就是这种功能的一个更加细节的扩展。

  在写处理文本的程序或者web页面时,定位匹配复杂模式的字符串是很常见的。正则表达式就是用来描述这类模式的。这样,一个正则表达式就是一个模式的缩减代码。例如,模式“\w+”是表达“匹配任何包含字母数字字符的非空字符串”的精确方法。.NET框架提供了一个功能强大类库,它使得在你的应用程序中包含正则表达式更加容易。使用这个库,你可以轻易地搜索和替换文本,解码复杂的标题,解析语言,或者验证文本。

  学习正则表达式的神秘的语法的一个好办法是用例子作为开始学习的对象,然后实践创建自己的正则表达式。

  让我们开始吧!


  一些简单的例子
 

  搜索Elvis

  假设你要花费你所有的空余时间来扫描文档来寻找Elvis仍然活着的证据。你可以使用下面的正则表达式来搜索:

  1. elvis -- Find elvis

  这是搜索精确字符序列的一个完全合法的正则表达式。在.NET中,你可以轻松的设置选项来忽略字符的各种情况,所以这个表达式将会匹配“Elivs”,“ELVIS”,或者“eLvIs”。不幸的是,它也将匹配单词“pelvis”的后五个字母。我们可以改进这个表达式如下:

  2. \belvis\b -- Find elvis as a whole word

  现在事情变得更加有趣了。“\b”是一个特殊代码,它表示“匹配任何单词的开头或结尾的位置”。这个表达式将只匹配完整的拼写为“elvis”的单词,无论是小写的还是大写的情况。

  假设你想要找到所有这样的行,在其中单词“elvis”后面都跟着单词“alive”。句点或者点“.”是一个特殊代码匹配除了换行符之外的任何字符。星号“*”表示重复前面的部分有必要的次数以保证能够有一个匹配。这样,“.*”表示“匹配除了换行符之外的任意数目的字符”。现在建立一个表示“搜索在同一行内后面跟着单词‘alive’的单词‘elvis’”的表达式就是一件简单的事了。

  3. \belvis\b.*\balive\b -- Find text with "elvis" followed by "alive"

  仅仅使用几个特殊字符我们就开始创建功能强大的正则表达式了,而且它们已经开始变得难以被我们人类理解了。

  让我们看看另一个例子。

  确定电话号码的合法性

  假设你的web页面收集顾客的7位电话号码,而且你希望验证输入的电话号码是正确的格式,“xxx-xxxx”,这里每个“x”是一个数字。下面的表达式将搜索整个文本寻找这样的一个字符串:

  4. \b\d\d\d-\d\d\d\d -- Find seven-digit phone number
每个“\d”表示“匹配任何单个数字”。“-”没有特殊的意义并且按照字面解释,匹配一个连字符。要避免繁琐的重复,我们可以使用一个含有相同含义的速记符:

  5. \b\d{3}-\d{4} -- Find seven-digit phone number a better way
“\d”后面的“{3}”表示“重复前面的字符三次”。

  .NET正则表达式的基础

  让我们探索一下.NET中正则表达式的基础

  特殊字符

  你应该知道几个有特殊意义的字符。你已经见过了“\b”,“.”,“*”,和“\d”。要匹配任何空白字符,像空格,制表符和换行符,使用“\s”。相似地,“\w”匹配任何字母数字字符。

  让我们尝试更多的例子:

  6. \ba\w*\b -- Find words that start with the letter a

  这个搜索一个单词的开头(\b),然后是一个字母“a”,接着是任意次数重复的字母数字字符(\w*),最后是一个单词的结尾(\b)。

  7. \d+ -- Find repeated strings of digits

  这里,“+”与“*”是相似的,除了它需要至少一次重复。

  8. \b\w{6}\b -- Find six letter words

  在Expresso中测试这几个表达式,然后实践创建你自己的表达式。下面是一个说明有特殊含义的字符的表格:

匹配除换行符外的任何字符
\w 匹配任何字母数字字符
\s匹配任何空白字符
\d匹配任何数字
\b匹配一个单词的开始或结尾
^匹配字符串的开始
$匹配字字符串的结尾

表1 正则表达式的常用特殊字符

  开始阶段

  特殊字符“^”和“$”被用来搜索那些必须以一些文本开头和(或)以一些文本结尾的文本。特别是在验证输入时特别有用,在这些验证中,输入的整个文本必须要匹配一个模式。例如,要验证一个7位电话号码,你可能要用:

  9. ^\d{3}-\d{4}$ -- Validate a seven-digit phone number

  这是和第5个例子一样的,但是强迫它符合整个文本字符串,匹配文本的头尾之外没有其他字符。通过在.NET中设置“Multiline”选项,“^”和“$”改变他们的意义为匹配一行文本的起点和结束,而不是整个正文字符串。Expresso的例子使用这个选项。

  换码字符

  当你想要匹配这些特殊字符中的一个时会产生一个错误,像“^”或者“$”。使用反斜线符号来去掉它们的特殊意义。这样,“\^”,“\.”,和“\\”,分别匹配文本字符“^”,“.”,和“\”。

  重复

  你已经见过了“{3}”和“*”可以指定一个单独字符的重复次数。稍后,你会看到相同的语法怎样用来重复整个子表达式。此外还有其他几种方法来指定一个重复,如下表所示:

*重复任意次数
+重复一次或多次
?重复一次或多次
{n}重复n次
{n