我們再看乙個更有趣的程式.這次我們來測試乙個字串是否和乙個由簡明模式(concise pattern)編碼產生的描述相匹配.
在這些模式(pattern)裡,一些字元或字元組合都有獨特的意義,包括:
複製** **如下:
範圍描述符 (比如,[a - z] 表示在a 到 z 範圍內的乙個字母)
\w 字母或數字;相當於 [0-9a-za-z]
\w 非字母,數字
\s [ \t\n\r\f]空字元;相當於 [ \t\n\r\f]&nbs程式設計客棧p;
\s 非空字元
\d [0-9]數字;相當於 [0-9]
\d 非數字字元
\b 退格符 (0x08) (僅在範圍描述符內部時)
\b 字邊界(word boundary) (在範圍描述符外部時)
\b 非字邊界
* 前面元素出現0或多次
+ 前面元素出現1或多次
前面元素最少出現m次,最多出現n次
? 前面元素最多出現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
|&nbwww.cppcns.comsp;end
nil
ruby> chab "not this one."
false
ruby> chab "maybe this? " # wrong kind of brackets
false
ruby> chab "or this? <0x38z7e>" # bogus hex digit
false
ruby> chab "okay, this: <0xfc0004>."
true
雖然,初看起來正規表示式挺讓人頭痛的,但你很快會因能夠如此高效地表達出你心中的意思而感到滿足.
下面是乙個可以幫助你實驗正規表示式的小程式,把它存為regx.rb,然後在命令列裡輸入'ruby regx.rb'執行.
複製** **如下:
# requires an ansi terminal!
st = "\033[7m"
en = "\033[m"
while true
print "str> "
stdout.flush
str = gets
break if not str
str.chop!
print "pat> "
stdout.flush
www.cppcns.com re = gets
break if not re
re.chop!
str.gsub! re, "#\\"
print str, "\n"
end
print "\n"
這個小程式要求輸入兩次,一次字串,一次正規表示式.輸入的字串由正規表示式檢驗,然後用反視高亮度顯示所有匹配部分.先別管細節,等會兒就有**分析.
複製** **如下:
str> foobar
pat> ^fo+
foobar
~~~
上面紅色部分將在程式輸入中以反視表示出.下面的"~~~"行是為了方便那些使用基於字元瀏覽器的人.
我們再試幾個輸入:
st程式設計客棧r> abc012dbcd555
pat> \d
abc012dbcd555
如果讓你感到www.cppcns.com驚訝,看看本頁開頭部分的那個**: \d與字母d無關,而是對應於單個數字.
如果有不止一種方法能匹配模式會怎樣呢?
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
之所以foozbooz被匹配而不只是fooz,是因為乙個正則表達符盡可能匹配最長的子串.
下面是乙個將冒號分隔的數字時間段從字串中隔離出來的模式匹配.
str> wed feb 7 08:58:04 jst 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
wed feb 7 08:58:04 jst 1996
"=~"是乙個用於匹配正規表示式的匹配(matching)運算子;它會返回在字串裡找到的匹配的位置,或者返回 nil 表示模式無法匹配.
ruby> "abcdef" =~ /d/
3 ruby> "aaaaaa" =~ /d/
nil
本文標題: ruby 正規表示式 教程
本文位址:
ruby正規表示式
ruby用 將正規表示式括起來。表示開頭,表示結尾,表示0個以上的任意字元。現在就講講正規表示式的規則的寫法。正規表示式中有很多上述的具有特別意義的字元。首先是下列字元。範圍描述符。a z 表示從a到z之間的任意乙個。w 英文本母和數字。即 0 9 a z a z w 非英文本母和數字 s 空字元,...
Ruby 正規表示式
ruby的正規表示式以 作為構造方法。表示式返回乙個regexp的物件。一般規則 a 匹配字元a。匹配特殊字元?特殊字元包括 匹配任意字元,例如 a.匹配ab和ac。ab c 匹配ac和bc,之間代表範圍。例如 a z a za z0 9 a za z0 9 匹配不在該範圍內的字串。d 代表任意數字...
ruby 正規表示式
ruby支援的正規表示式符號 元字元 有這麼個規則 不帶 的數字和字母不是元字元 帶 的符號也不是元字元 下文中出現的 匹配多位元組字元的正規表示式 是指,通過使用 kcode進行設定,或顯式地使用漢字選項 請參考正規表示式字面值 等方式進行的匹配多位元組字元的正規表示式。行首。與字串的頭部或換行符...