ruby 正規表示式 教程

2022-09-26 06:12:08 字數 2939 閱讀 8496

我們再看乙個更有趣的程式.這次我們來測試乙個字串是否和乙個由簡明模式(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進行設定,或顯式地使用漢字選項 請參考正規表示式字面值 等方式進行的匹配多位元組字元的正規表示式。行首。與字串的頭部或換行符...