轉(zhuǎn):Ruby筆記–正則表達式

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次以上,但盡可能少重復

http://rubyer.me/blog/357/

iReader iReader Logo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末不跟,一起剝皮案震驚了整個濱河市颓帝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窝革,老刑警劉巖购城,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虐译,居然都是意外死亡瘪板,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門漆诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮攀,“玉大人锣枝,你說我怎么就攤上這事±加ⅲ” “怎么了撇叁?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箭昵。 經(jīng)常有香客問我税朴,道長,這世上最難降的妖魔是什么家制? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任正林,我火速辦了婚禮,結(jié)果婚禮上颤殴,老公的妹妹穿的比我還像新娘觅廓。我一直安慰自己,他們只是感情好涵但,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布杈绸。 她就那樣靜靜地躺著,像睡著了一般矮瘟。 火紅的嫁衣襯著肌膚如雪瞳脓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天澈侠,我揣著相機與錄音劫侧,去河邊找鬼。 笑死哨啃,一個胖子當著我的面吹牛烧栋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳球,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼审姓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祝峻?” 一聲冷哼從身側(cè)響起魔吐,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莱找,沒想到半個月后酬姆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宋距,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年轴踱,在試婚紗的時候發(fā)現(xiàn)自己被綠了症脂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谚赎。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淫僻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壶唤,到底是詐尸還是另有隱情雳灵,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布闸盔,位于F島的核電站悯辙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迎吵。R本人自食惡果不足惜躲撰,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望击费。 院中可真熱鬧拢蛋,春花似錦、人聲如沸蔫巩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆仔。三九已至垃瞧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坪郭,已是汗流浹背个从。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留截粗,地道東北人信姓。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像绸罗,于是被迫代替她去往敵國和親意推。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容