Ruby筆記–正則表達式
Ruby對正則表達式支持非常好仆救,下面將對我經(jīng)常使用到的做一個總結(jié),包括Ruby中正則的寫法矫渔,匹配的方法彤蔽,替換,分組匹配等庙洼。
1顿痪、Ruby中正則表達式的寫法
主要有三種
在//之間,要進行轉(zhuǎn)義
在%r{}內(nèi)油够,不用進行轉(zhuǎn)義
Regexp.new()內(nèi)蚁袭,不用進行轉(zhuǎn)義
/mm/dd/,Regexp.new(“mm/dd”)石咬,%r{mm/dd}三者效果相同揩悄,實質(zhì)都是新建了一個Regexp的類。
2鬼悠、匹配的兩種方法
=~肯定匹配, !否定匹配删性。=表達式返回匹配到的位置索引,失敗返回nil焕窝,符號左右內(nèi)容可交換
regexp#match(str)蹬挺,返回MatchData,一個數(shù)組袜啃,從0開始,還有match.pre_match返回匹配前內(nèi)容幸缕,match.post_match返回匹配后內(nèi)容
/cat/ =~ "dog and cat" #返回8
mt = /cat/.match("bigcatcomes")
"#{mt.pre_match}->#{mt[0]}<-#{mt.post_match}" #返回big->cat<-comes
3群发、替換
很多時候匹配是為了替換,Ruby中進行正則替換非常簡單发乔,兩個方法即可搞定熟妓,sub()+gsub()。
sub只替換第一次匹配栏尚,gsub(g:global)會替換所有的匹配起愈,沒有匹配到返回原字符串的copy
str = "ABDADA"
new_str = str.sub(/A/, "") #返回"BDADA"
new_str2 = str.gsub(/A/, "") #返回"BDD"
如果想修改原始字符串用sub!()和gsub!(),沒有匹配到返回nil。
方法后面還可以跟block抬虽,對匹配的字符串進行操作
a.gsub(/[aeiou]/) {|vowel| vowel.upcase } # => "qUIck brOwn fOx"
4官觅、分組匹配
Ruby的分組匹配與其它語言差別不大,分組匹配表達式是對要進行分組的內(nèi)容加()阐污。
對于匹配到的結(jié)果休涤,可以用系統(tǒng)變量#$1,#$2…索引笛辟,也可用matchData數(shù)組來索引
md = /(\d\d):(\d\d)(..)/.match("12:50am") # md為一個MatchData對象
puts "Hour is #$1, minute #$2"
puts "Hour is #{md[1]}, minute #{md[2]}"
5功氨、匹配所有
regexp#match()只能匹配一次,如果想匹配所有要用regexp#scan()
用法示例:
"abcabcabz".scan(%r{abc}).each {|item| puts item} # 輸出2行abc
6手幢、貪婪匹配vs懶惰匹配
這兩種匹配屬于標準正則表達式內(nèi)容捷凄,與Ruby沒關(guān),但新手如果不明白匹配時會發(fā)生莫名其妙的錯誤围来,所以特別總結(jié)一下跺涤。
貪婪匹配:盡可能多匹配,正則默認是貪婪匹配管钳。例子:a.b它將會匹配最長的以a開始钦铁,以b結(jié)束的字符串。對于aabab的匹配結(jié)果是aabab才漆。
懶惰匹配:盡可能少匹配牛曹。例子:a.?b對于aabab的匹配結(jié)果是aab和ab。
一般是在原來表達式結(jié)尾加?就由貪婪匹配變成了懶惰匹配醇滥。常用的懶惰限定符有(去年最后的問題就是貪婪匹配):
?重復任意次黎比,但盡可能少重復
+?重復1次或更多次,但盡可能少重復
??重復0次或1次鸳玩,但盡可能少重復
{n,m}?重復n到m次阅虫,但盡可能少重復
{n,}?重復n次以上,但盡可能少重復
iReader iReader Logo