了解正則表達式
--------------------------------------------------------------------------------
摘要
相信大家都聽說過正則表達式,用它可以在字段中進行高速查找、替換等功能。使用正則表達式可以輕松的對文本進行控制。比如,如果您想知道一個字符串的數字表達式是否在 "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)
|