詳解Ruby中Regex對字串的匹配和替換操作_ruby專題

來源:互聯網
上載者:User

正則匹配

說起Ruby當然要提起它的Regex機制,Regex作為一個強大的匹配語言已經越來越多的使用到不同的領域當中,從字串驗證,匹配,到網頁抽取等。雖然有些人詬病與Regex的匹配效率,但是考慮到正則的強大匹配能力也就無所謂了。

說起RubyRegex不就不能不說起Ruby的=~和match兩種匹配方式,我們還是用執行個體來說明一下這兩種匹配方式的區別吧。先來說一說=~的用法吧:

message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/ putsregex=~message message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/ putsregex=~message 

在Ruby當中是用//來表示Regex匹配語句的。大家可以運行一下,上面的語句是匹配三個數字兩邊都是小寫字母的一個字串。我們運行上面代碼,將會出現結果10.你一定很奇怪,為什麼會出現10這個結果,這就是=~的魅力,他是將匹配結果的首次出現位置列印出來。

那下面我們來看看match吧:

message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/ putsregex.match(message)  message="afhadhffkdf414j" regex=/[a-z](\d{3})[a-z]/  putsregex.match(message) 

我們來看看輸出結果吧:f414j。該字串表示的正則語句匹配的所有符合規則的結果集。不知道大家注意到沒,我們在Regex裡面用到了括弧,我們希望抽取出三個數字就可以了。當然這也很簡單,我們只需要在上面的代碼當中稍作修改即可:

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的結果吧。

C:/Users/Administrator/Documents/NetBeansProjects/RubyApplication1/lib/regex.rb

 
它是輸出的該對象資訊。

下面又出現了一個新的情況,假設一個字串當中有很多符合規則的資訊怎麼辦呢。上面的語句只能匹配出最先找到的結果,而我們需要把所有的結果都列印出來怎麼辦呢?剛開始我受java的影響,認為match的結果會是一個集合,所以怎麼考慮也沒有整出來。後來發現有一個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]}"} 

很簡單,結果就是:

Theresultis414 Theresultis223 Theresultis123  Theresultis414 Theresultis223 Theresultis123 

怎麼樣,很方便吧。很簡單的就把所有的匹配結果都抽取出來了。

Regex的分組

可以對Regex進行分組,並在匹配成功後把分組的值儲存到$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")  


正則中的特殊全域變數:

  •     $1,$2,$3....分組匹配文本
  •     $`   匹配文本之前的文本
  •     $'    匹配文本之後的文本
print <pre name="code" class="ruby">,"\n",{1},"\n", if "ab9cd" =~ /\d/ 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.