正規表示式之字元組

broadviewbj發表於2012-05-15

正規表示式之字元組

普通字元組

字元組Character Class)是正規表示式最基本的結構之一,要理解正規表示式的“靈活”,認識它是第一步。

顧名思義,字元組就是一組字元,在正規表示式中,它表示“在同一個位置可能出現的各種字元”,其寫法是在一對方括號[]之間列出所有可能出現的字元,簡單的字元組比如[ab][314][#.?]在解決一些常見問題時,使用字元組可以大大簡化操作,下面舉“匹配數字字元”的例子來說明。

字元可以分為很多類,比如數字、字母、標點等。有時候要求 “只出現一個數字字元”,換句話說,這個位置上的字元只能是012、…、8910個字元之一。要進行這種判斷,通常的思路是:用10個條件分別判斷字元是否等於這10個字元,對10個結果取“或”,只要其中一個條件成立,就返回True,表示這是一個數字字元,其虛擬碼如例1-1所示。

 

1-1 判斷數字字元的虛擬碼

charStr == "0" || charStr == "1" || charStr == "9"

 

注:因為正規表示式處理的都是“字串”(String)而不是“字元”,所以這裡假設變數charStr(雖然它只包含一個字元)也是字串型別,使用了雙引號,在有些語言中字串也用單引號表示。

 

這種解法的問題在於太煩瑣——如果要判斷是否是一個小寫英文字母,就要用||連線26個判斷;如果還要相容大寫字母,則要連線52個判斷,程式碼長到幾乎無法閱讀。相反,用字元組解決起來卻異常簡單,具體思路是:列出可能出現的所有字元(在這個例子裡就是10個數字字元),只要出現了其中任何一個,就返回True。例1-2給出了使用字元組判斷的例子,程式語言使用Python

 

1-2  用正規表示式判斷數字字元

re.search("[0123456789]", charStr) != None

 

re.search()Python提供的正規表示式操作函式,表示“進行正規表示式匹配”;charStr仍然是需要判斷的字串,而[0123456789]則是以字串形式給出的正規表示式,它是一個字元組,表示“這裡可以是012、…、89中的任意一個字元。只要charStr與其中任何一個字元相同(或者說“charStr可以由[0123456789]匹配”),就會得到一個MatchObject物件(這個物件暫時不必關心,在第21頁會詳細講解);否則,返回None。所以判斷結果是否為None,就可以判斷charStr是否是數字字元。

當今流行的程式語言大多支援正規表示式,上面的例子在各種語言中的寫法大抵相同,唯一的區別在於如何呼叫正規表示式的功能,所以用法其實大同小異。例1-3列出了常見語言中的表示,如果你現在就希望知道語言的細節,可以參考本書第三部分的具體章節。

 

1-3  用正規表示式判斷數字字元在各種語言中的應用[1]

.NETC#

//能匹配則返回true,否則返回false

Regex.IsMatch(charStr, "[0123456789]");

Java

//能匹配則返回true,否則返回false

charStr.matches("[0123456789]");

JavaScript

//能匹配則返回true,否則返回false

/[0123456789]/.test(charStr);

PHP

//能匹配則返回1,否則返回0

preg_match("/[0123456789]/", charStr);

Python

#能匹配則返回RegexObject,否則返回None

re.search("[0123456789]", charStr)

Ruby

#能匹配則返回0,否則返回nil

charStr =~ /[0123456789]/

 

可以看到,不同語言使用正規表示式的方法也不相同。如果仔細觀察會發現Java.NETPythonPHP中的正規表示式,都要以字串形式給出,兩端都有雙引號";而RubyJavaScript中的正規表示式則不必如此,只在首尾有兩個斜線字元/,這也是不同語言中使用正規表示式的不同之處。不過,這個問題現在不需要太關心,因為本書中大部分例子以Python程式來講解,下面講解關於Python的基礎知識,其他語言的細節留到後文會詳細介紹。

 

 正規表示式之字元組

本文節選自《正則指引》一書 餘晟著

圖書詳細資訊:



 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-729859/,如需轉載,請註明出處,否則將追究法律責任。

相關文章