了解正则表达式
--------------------------------------------------------------------------------
摘要
相信大家都听说过正则表达式,用它可以在字段中进行高速查找、替换等功能。使用正则表达式可以轻松的对文本进行控制。比如,如果您想知道一个字符串的数字表达式是否在 "0.1"–"9.9" 之间(注意,只有一位小数),您会用什么方法办到这个需求呢?我想您会一个 char 一个 char 的检测,这样会很麻烦,需要很多代码。我们这里有个更简单更快的解决方案,那就是正则表达式。本文将通过一些实际示例来体现正则表达式的应用和组成。
--------------------------------------------------------------------------------
目录
示例一:利用正则表达式检测字符串中数字为 "0.1"-"9.9"
示例二:利用正则表达式提取 url 中的信息
总结
参考信息
有关作者
--------------------------------------------------------------------------------
示例一:利用正则表达式检测字符串中数字为 “0.1”-“9.9”
这是我们刚才提到过的。我想大多数人都不会不耐其烦的先看理论,所以我们先从代码入手,我会在后面作解释的:
[Visual Basic] Dim examples() As String = {"3.4", "0.0", "9.90", "04.9", "9.9", "0.1"} Dim rule As New Regex("^[0-9]\.(?(?<=0\.)[1-9]|[0-9])$") Dim i As Integer For i = 0 To examples.GetUpperBound(0) Console.WriteLine("{0} is between 0.1-0.9: {1}", _ examples(i), rule.IsMatch(examples(i))) Next
Regex 封装了正则表达式,它在 System.Text.RegularExpressions 名字空间中。让我们来看看我们作了什么。我们创建了一个正则表达式,然后用这个正则表达式在各个 example 中搜索,符合表达式的将显示 True 而不符合的将显示 False。你会问,这个表达式到底是怎样的。好吧,让我们来分析一下:
^[0-9]\.(?(?<=0\.)[1-9]|[0-9])$
^ - 一行或 string 的开始。
$ - 一行或 string 的末尾。
[0-9] - 从 0 到 9 的任何一个数字。
\. - 一个"."。
(?(expression)yes|no) - 这代表一个选择,如果 expression 在这里被搜索到的话就执行 yes 部分,否则就执行 no 部分。注意没有空格!
(?<=expression) – 这是说在现在位置的左边有 expression。
好了,如果我们连贯起来说意思就是:"第一个字符是任何一个从 0 到 9 的数字,紧接着是一个 . 然后,如果前两个字符是 0. 的话最后这个字符就得是从 1 到 9 的任何一个数字,如果前两个字符不是 0. 的话那么最后的这个字符就可以是从 0 到 9 的任何一个数字。"好了,我们已经完成了第一个示例,我相信您对正则表达式和正则表达式的构造已经有一定的了解了吧?
--------------------------------------------------------------------------------
示例二:利用正则表达式提取 url 中的信息
让我们来假设一种情况,我们需要在一个 url 中提取 domain 部分,例如:
http://www.microsoft.com/china/community/
我们要提取 www.microsoft.com 这一部分。当然,用普通方法做到这一要求非常的困难,不过我们可以再次依赖正则表达式,让它来为我们轻松的完成工作。为了让构造更简单些,在这里我们假设所有的 url 都是 http 的,也就是说,不包括 ftp 或是其他的协议。这一次我们会逐步构件这个正则表达式:
1、 每个 web url 的开头都是 http:// 或 https:// 所以我们的正则表达式这样开始:
^https?://
这里唯一没有介绍过的部分是"?",它是一个数量修饰符,意思是说被他修饰的字符只能重复 0-1 次,0 次就是说被修饰的字符可以没有。
2、 接下来的部分一直到重新出现"/"就是我们需要提取的 domain 部分了。逻辑很简单,这样:
[^/]+
"[]"表示一组字符,"^"在"[]"里代表去除的意思,合起来说是除了"/"外所有的字符。"+"是一个数量修饰符,从 1-?,也就是说,至少有 1 个被修饰的字符。
3、 接下来的字符要么是一个"/"要么就是字符串的结尾。这也很容易理解,这一部分是:
(/|$)
"()"是用来定义一个组的,一个组可以有一个 id 或一个 name,组的用法我们将在后面提到。"|" 有 or 的意思,也就是说,这个字符或者是"/"或者是结尾。我们这里用一个组将其包括是因为如果不这样做,"|"将对前面的所有表达式响应而并不是单单的响应"/"。
好了,我们已经简单的构造了一个正则表达式,它的完整方式是:"^https?://[^/]+(/|$)"。在不久前当您看到这样一个表达式时您会感到很迷惑,不过现在对您来说这没有什么,显而易见。
我们已经构造了表达式,但是如何提取所需的部分呢?这就要用到组了。我们知道,一个组用"()"实现,它可以有一个 id number 也可以有一个 name,现在我们需要知道如何定义 id 与 name。
id:由表达式自动安排。每个完整的表达式永远是第 0 组,然后按"()"的顺序安排 id。拿我们的例子来说,"^https?://[^/]+(/|$)" 是第 0 组,"(/|$)" 是第一组。
name:(?<name>expression) 是用来定义有 name 的组的。这样的组当然也有一个 id,但他们可以用 name 来调用,这样就方便了在编程时的使用。我们将用这种方式来提取 domain。
也就是说,我们将在负责搜索 domain 的部分加上一个组,而负责 domain 的部分是这一段:[^/]+,加上一个名叫 domain 的组之后就是这样的了:(?<domain>[^/]+),现在我们的正则表达式是:"^https?://(?<domain>[^/]+)(/|$)"。有了这个正则表达式编程的代码就好写了:
[Visual Basic] Dim examples(2) As String examples(0) = "https://www.microsoft.com/china/community/" examples(1) = "https://www.microsoft.com" examples(2) = "http://www.microsoft.com/" Dim rule As New Regex("^https?://(?<domain>[^/]+)(/|$)") Dim i As Integer For i = 0 To examples.GetUpperBound(0) Console.WriteLine(rule.Match(examples(i)).Groups("domain")) Next
Match 是一个符合表达式的结果,这一段是说获得一个符合表达式的结果,然后显示它的 domain 组中的内容,也就是我们要提取的 domain 了。当然,这一段代码很可能会发生错误,比如当没有 Match 的时候,不过本文重点讨论正则表达式,所以这些不足就留给读者解决了。
--------------------------------------------------------------------------------
总结
在本文中讨论过的主题:
正则表达式是干什么用的
正则表达式的构造方法
正则表达式的构造策略
本文还对正则表达式的应用和它的一些组成部分作了探讨。本文的目的是抛砖引玉,希望读者在读完后能够自己推敲,摸索正则表达式更深一步的使用。
--------------------------------------------------------------------------------
参考信息
极力推荐文档中的 Regular Expression Language Elements
有英文版的朋友们可以用以下链接:
ms-help://MS.VSCC/MS.MSDNVS/cpgenref/html/cpconregularexpressionslanguageelements.htm
--------------------------------------------------------------------------------
作者:袁伟(Kefroth)
|