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 | str = "ABDADA" |
分组匹配
Ruby的分组匹配与其它语言差别不大,分组匹配表达式是对要进行分组的内容加()。对于匹配到的结果,可以用系统变量$1,$2…索引,也可用matchData数组来索引
1 | md = /(\d\d):(\d\d)(..)/.match("12:50am") # md为一个MatchData对象 |
匹配所有
regexp#match()只能匹配一次,如果想匹配所有要用regexp#scan()用法示例:
1 | "abcabcqwe".scan(%r{abc}).each {|x| puts x} # 输出2行abc |