正則匹配
說起Ruby當然要提起它的正則表達式機制,正則表達式作為一個強大的匹配語言已經越來越多的使用到不同的領域當中,從字符串驗證,匹配,到網頁抽取等。雖然有些人詬病與正則表達式的匹配效率,但是考慮到正則的強大匹配能力也就無所謂了。
說起Ruby正則表達式不就不能不說起Ruby的=~和match兩種匹配方式,我們還是用實例來說明一下這兩種匹配方式的區別吧。先來說一說=~的用法吧:
1
2
3
4
5
6
|
message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ puts regex=~message message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ puts regex=~message |
在Ruby當中是用//來表示正則表達式匹配語句的。大家可以運行一下,上面的語句是匹配三個數字兩邊都是小寫字母的一個字符串。我們運行上面代碼,將會出現結果10.你一定很奇怪,為什么會出現10這個結果,這就是=~的魅力,他是將匹配結果的首次出現位置打印出來。
那下面我們來看看match吧:
1
2
3
4
5
6
7
8
|
message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ puts regex.match(message) message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ puts regex.match(message) |
我們來看看輸出結果吧:f414j。該字符串表示的正則語句匹配的所有符合規則的結果集。不知道大家注意到沒,我們在正則表達式里面用到了括號,我們希望抽取出三個數字就可以了。當然這也很簡單,我們只需要在上面的代碼當中稍作修改即可:
1
2
3
4
5
6
7
8
9
|
message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ regex.match(message) puts $1 message= "afhadhffkdf414j" regex=/[a-z](\d{ 3 })[a-z]/ regex.match(message) puts $1 |
結果自然是414.為什么要使用$1而不是$0呢,我們看看$0的結果吧。
1
|
C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb |
它是輸出的該對象信息。
下面又出現了一個新的情況,假設一個字符串當中有很多符合規則的信息怎么辦呢。上面的語句只能匹配出最先找到的結果,而我們需要把所有的結果都打印出來怎么辦呢?剛開始我受java的影響,認為match的結果會是一個集合,所以怎么考慮也沒有整出來。后來發現有一個scan方法。代碼如下所示:
1
2
3
4
5
6
7
|
message= "afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf" regex=/[a-z](\d{ 3 })[a-z]/ message.scan(regex). each {|m|puts "Theresultis#{m[0]}" } message= "afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf" regex=/[a-z](\d{ 3 })[a-z]/ message.scan(regex). each {|m|puts "Theresultis#{m[0]}" } |
很簡單,結果就是:
1
2
3
4
5
6
7
|
Theresultis414 Theresultis223 Theresultis123 Theresultis414 Theresultis223 Theresultis123 |
怎么樣,很方便吧。很簡單的就把所有的匹配結果都抽取出來了。
正則表達式的分組
可以對正則表達式進行分組,并在匹配成功后把分組的值存儲到$1,$2,$3,$4.......
1
|
print $1 , "\n" , $2 if "a1b2c3d4e5" =~ /(\w{ 2 })(\w*)/ |
字符串的正則替換:
1
2
3
|
print "abcd" .sub(/\w/, "9" ) print "\n" print "abcd" .gsub(/\w/, "9" ) |
正則中的特殊全局變量:
- $1,$2,$3....分組匹配文本
- $` 匹配文本之前的文本
- $' 匹配文本之后的文本
1
2
3
|
print <pre name= "code" class = "ruby" >, "\n" ,{ 1 }, "\n" , if "ab9cd" =~ /\d/ |