我們再看一個更有趣的程序.這次我們來測試一個字符串是否和一個由簡明模式(concise pattern)編碼產生的描述相匹配.
在這些模式(pattern)里,一些字符或字符組合都有獨特的意義,包括:
代碼如下:
[] 范圍描述符 (比如,[a - z] 表示在a 到 z 范圍內的一個字母)
/w 字母或數字;相當于 [0-9A-Za-z]
/W 非字母,數字
/s [ /t/n/r/f]空字符;相當于 [ /t/n/r/f]
/S 非空字符
/d [0-9]數字;相當于 [0-9]
/D 非數字字符
/b 退格符 (0x08) (僅在范圍描述符內部時)
/b 字邊界(word boundary) (在范圍描述符外部時)
/B 非字邊界
* 前面元素出現0或多次
+ 前面元素出現1或多次
{m,n} 前面元素最少出現m次,最多出現n次
? 前面元素最多出現1次;相當于 {0,1}
| 與前面或后面的表達式匹配
() 群( grouping)
那些模式中共同使用的古怪詞匯叫做正則表達式.就象Perl一樣,Ruby也用前斜杠(而不是雙引號)將它們括起來.如果你以前從未使用過正則表達式,也許它們看起來除了規則(regular)什么都不是,但花上一點兒時間了解它們是明智的.當你需要對字符串進行模式匹配,查找或其它操作時,它的高效的表達能力能治好你的頭痛(并節約很多行代碼).
舉個例子,設想我們想要測試一個字符串是否符合這樣的描述信息"由小寫f開頭,跟一個大寫字母,并可能跟許多非小寫字母在后面."如果你是一個老練的C程序員,大概你的頭腦里已經裝滿幾十行程序了,對不對?承認吧,你難以控制住自己.在Ruby里,你只需要將你的字符串用正則表達式/^f[A-Z](^[a-z])*$/檢驗一下就可以了.
那"一個由<>括起來的16位數呢"?沒問題.
代碼如下:
ruby> def chab(s) # "contains hex in angle brackets"
| (s =~ /<0(x|X)(/d|[a-f]|[A-F])+>/) != nil
| end
nil
ruby> chab "Not this one."
false
ruby> chab "Maybe this? {0x35}" # wrong kind of brackets
false
ruby> chab "Or this? <0x38z7e>" # bogus hex digit