主要有三种
/mm\/dd/,Regexp.new(“mm/dd”),%r{mm/dd}三者效果相同,实质都是新建了一个Regexp的类。
1
2
3 |
/cat/ =~ "dog and cat"
#返回8 mt = /cat/.match( "bigcatcomes" ) "#{mt.pre_match}->#{mt[0]}<-#{mt.post_match}"
#返回big->cat<-comes |
很多时候匹配是为了替换,Ruby中进行正则替换非常简单,两个方法即可搞定,sub()+gsub()。
sub只替换第一次匹配,gsub(g:global)会替换所有的匹配,没有匹配到返回原字符串的copy
1
2
3 |
str = "ABDADA" new_str = str.sub(/ A /, "*" ) #返回"*BDADA" new_str2 = str.gsub(/ A /, "*" ) #返回"*BD*D*" |
如果想修改原始字符串用sub!()和gsub!(),没有匹配到返回nil。
方法后面还可以跟block,对匹配的字符串进行操作
1 |
a.gsub(/[aeiou]/) {|vowel| vowel.upcase } # => "qUIck brOwn fOx" |
Ruby的分组匹配与其它语言差别不大,分组匹配表达式是对要进行分组的内容加()。
对于匹配到的结果,可以用系统变量#$1,#$2…索引,也可用matchData数组来索引
1
2
3 |
md = /(\d\d):(\d\d)(..)/.match( "12:50am" ) # md为一个MatchData对象 puts "Hour is #$1, minute #$2" puts "Hour is #{md[1]}, minute #{md[2]}" |
regexp#match()只能匹配一次,如果想匹配所有要用regexp#scan()
用法示例:
1 |
"abcabcabz" .scan(%r{abc}). each
{|item| puts item} # 输出2行abc |
这两种匹配属于标准正则表达式内容,与Ruby没关,但新手如果不明白匹配时会发生莫名其妙的错误,所以特别总结一下。
一般是在原来表达式结尾加?就由贪婪匹配变成了懒惰匹配。常用的懒惰限定符有(去年最后的问题就是贪婪匹配):
原文地址:http://www.cnblogs.com/qinyan20/p/3759812.html