【第153期 June 5, 2010】
 

研發新視界

檢查字串惹毛你嗎?試試看正規表示式吧!

作者/沈顥祐

[發表日期:2010/6/5]




前言

正規表示式(Regular Expression)是一種能精簡地描述字串格式的方法。

為什麼要使用正規表示式?在開發程式過程中,常常需要判斷使用者輸入的字串符不符合格式,如車牌、電話號碼等等,為了檢查這些字串而大費周章的撰寫if等等的判斷function,除了是扼殺工程師的青春歲月外,維護上也比較麻煩。使用正規表示式以後,你可以省下許多的時間,並且便於維護。

論正規表示表

一開始先從例子說起吧。假設我們需要製作一個抽獎箱,裡面有十張號碼牌,分別是0到9號,一次只能抽一個號碼,那該怎麼設計它呢?第一步當然是準備一個箱子,接著把號碼牌放進箱子裡,那他看起來應該很像下列這個式子:

[ 0 1 2 3 4 5 6 7 8 9 ]

我們可以把中括弧想像成箱子,而裏面的數字則是號碼牌,那麼就完成了這個抽獎箱。而在正規表示式裡,要表達出某個單一字元所有可能值的集合,也是使用上述的式子。不過可能出現的數值,是一連續數字的話,就能把上式簡化成[0-9] 了。英文字母的應用情形也是相同的,表達所有的英文字母,可以寫成[ a-zA-Z ]

是要將情況改為從四個不一樣的箱子裡各抽出一個號碼呢?這情形就有點像台灣彩卷的四星彩了,用下面的式子表示吧!

[ 0-9 ] [ 0-9 ] [ 0-9 ] [ 0-9 ]

很明顯的,這種方式不是最好的方法,在表達次數上,我們可以用大括弧來修飾次數。

[ 0-9 ]{4}

大括弧修飾次數上,還有不一樣的用法,[ 0-9 ]{ n, m }表示,前方的[ 0-9 ]會最少重複出現n次,而最多會有m次。例如ATM的密碼長度為6至12碼,在表示上就為{6, 12}。而 { n, } 和 { , m} 則分別表示最少出現n次與最多出現m次。

有一些符號也可用來修飾次數,他們對應的關係如下:



在字元集合中,我們會用到 ^,例如[^abc]用來表示所有非abc的字元,此外也有一些特殊符號是用在字元集合的:



除了會變動的字元外,不會變動的字元我們該怎麼表示呢?例如加上區碼的市內電話:(02)2191-6066,我們先討論區碼02,其中0的部分是不變的,而2的話是會有變化的,因此這部分的正規表示式要寫成 0[2-8]。接下來小括弧具有特殊的功能,可用來指定判別表示式時的運算順序,但在這裡我們只是要小括弧的字元,而不是功能,這時後可以用中括弧去包住它,如:[(]。題外話,處理中括弧也是這麼做,如:[[],這樣就可以得到 [ 的字元了。第一段的號碼有時3碼有時4碼,就把他寫成 \d{3,4}。接著 - 字元不會變動,而且在 [ ] 外部也不是特殊符號,因此把它做為字元時,直接寫下就好。那麼在這個例子中,我們可以將電話號碼寫成 [(]0[2-8][)]\d{3,4}-\d{4}。

應用在VB.Net時,我們可以直接套用RegularExpressionValidator控制項,並修改其屬性ValidationExpression,來對TextBox進行檢查。在VB Code中,能使用以下的Code進行測試。

    '用單行程式碼判斷電話號碼格式,回傳Boolean
    Regex.Match(PhoneNumber, "[(]0\d[)]\d{4}-\d{4}ext\d{4}").Success

    '用多行程式碼判斷電話號碼格式
    '先寫好正規表示式,接著可以比對多組電話號碼
    Dim reg_exp As New Regex("[(]0\d[)]\d{4}-\d{4}ext\d{4}")
    If reg_exp.IsMatch(PhoneNumber1) Then
    Else
    End If


參考資料

1.正規表式-維基百科,自由的百科全書,http://zh.wikipedia.org/zh-tw/Regular_Expression

2.Introduction To .NET Regular Expression,http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/30/introduction-to-net-regular-expression.aspx