ruby-re

Ruby中正则表达式的写法

主要有三种

  • 在//之间,要进行转义
  • 在%r{}内,不用进行转义
  • Regexp.new()内,不用进行转义

匹配的两种方法

  • =~肯定匹配, !~否定匹配。=~表达式返回匹配到的位置索引,失败返回nil,符号左右内容可交换

  • regexp#match(str),返回MatchData,一个数组,从0开始,还有match.pre_match返回匹配前内容,match.post_match返回匹配后内容

    1
    2
    3
    4
    /cat/ =~ "dog and cat"     #返回8
    # 类似python可以将正则放入一个变量,如re = Regexp.new(/cat/),在后续匹配时直接使用re
    mt = /cat/.match("bigcatcomes") # mt = re.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/, "a") #返回"aBDADA"
new_str2 = str.gsub(/A/, "a") #返回"aBDaDa"

分组匹配

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
"abcabcqwe".scan(%r{abc}).each {|x| puts x} # 输出2行abc