正則匹配
說起Ruby當(dāng)然要提起它的正則表達(dá)式機(jī)制,正則表達(dá)式作為一個(gè)強(qiáng)大的匹配語言已經(jīng)越來越多的使用到不同的領(lǐng)域當(dāng)中,從字符串驗(yàn)證,匹配,到網(wǎng)頁抽取等。雖然有些人詬病與正則表達(dá)式的匹配效率,但是考慮到正則的強(qiáng)大匹配能力也就無所謂了。
說起Ruby正則表達(dá)式不就不能不說起Ruby的=~和match兩種匹配方式,我們還是用實(shí)例來說明一下這兩種匹配方式的區(qū)別吧。先來說一說=~的用法吧:
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當(dāng)中是用//來表示正則表達(dá)式匹配語句的。大家可以運(yùn)行一下,上面的語句是匹配三個(gè)數(shù)字兩邊都是小寫字母的一個(gè)字符串。我們運(yùn)行上面代碼,將會(huì)出現(xiàn)結(jié)果10.你一定很奇怪,為什么會(huì)出現(xiàn)10這個(gè)結(jié)果,這就是=~的魅力,他是將匹配結(jié)果的首次出現(xiàn)位置打印出來。
那下面我們來看看match吧:
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)
我們來看看輸出結(jié)果吧:f414j。該字符串表示的正則語句匹配的所有符合規(guī)則的結(jié)果集。不知道大家注意到?jīng)],我們?cè)谡齽t表達(dá)式里面用到了括號(hào),我們希望抽取出三個(gè)數(shù)字就可以了。當(dāng)然這也很簡(jiǎn)單,我們只需要在上面的代碼當(dāng)中稍作修改即可:
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
結(jié)果自然是414.為什么要使用$1而不是$0呢,我們看看$0的結(jié)果吧。
C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb
它是輸出的該對(duì)象信息。
下面又出現(xiàn)了一個(gè)新的情況,假設(shè)一個(gè)字符串當(dāng)中有很多符合規(guī)則的信息怎么辦呢。上面的語句只能匹配出最先找到的結(jié)果,而我們需要把所有的結(jié)果都打印出來怎么辦呢?剛開始我受java的影響,認(rèn)為match的結(jié)果會(huì)是一個(gè)集合,所以怎么考慮也沒有整出來。后來發(fā)現(xiàn)有一個(gè)scan方法。代碼如下所示:
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]}"}
很簡(jiǎn)單,結(jié)果就是:
Theresultis414 Theresultis223 Theresultis123 Theresultis414 Theresultis223 Theresultis123
怎么樣,很方便吧。很簡(jiǎn)單的就把所有的匹配結(jié)果都抽取出來了。
正則表達(dá)式的分組
可以對(duì)正則表達(dá)式進(jìn)行分組,并在匹配成功后把分組的值存儲(chǔ)到$1,$2,$3,$4.......
print $1,"\n",$2 if "a1b2c3d4e5" =~ /(\w{2})(\w*)/
字符串的正則替換:
print "abcd".sub(/\w/,"9") print "\n" print "abcd".gsub(/\w/,"9")
正則中的特殊全局變量:
print pre name="code" class="ruby">,"\n",{1},"\n", if "ab9cd" =~ /\d/
標(biāo)簽:自貢 石嘴山 鄂州 宜春 六安 淄博 河北 松原
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Ruby中正則表達(dá)式對(duì)字符串的匹配和替換操作》,本文關(guān)鍵詞 詳解,Ruby,中,正則,表達(dá)式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。