ruby 正则表达式Regexp
ruby正则表达式在线编辑器:rubular
一般规则:
/a/匹配字符a。
/\?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.
.匹配任意字符,例如/a./匹配ab和ac
/[ab]c/匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-zA-Z0-9]/
/[^a-zA-Z0-9]/匹配不在该范围内的字符串
/[\d]/代表任意数字
/[\w]/代表任意字母,数字或者_
/[\s]/代表空白字符,包括空格,TAB和换行
/[\D]/,/[\W]/,/[\S]/均为上述的否定情况
高级规则:
?代表0或1个字符。/Mrs?\.?/匹配"Mr","Mrs","Mr.","Mrs."(非贪婪)
*代表0或多个字符。/Hello*/匹配"Hello","HelloJack"(贪婪)
+代表1或多个字符。/a+c/匹配:"abc","abbdrec"等等(贪婪)
/d{3}/匹配3个数字
/d{1,10}/匹配1-10个数字
/d{3,}/匹配3个数字以上
/([A-Z]\d){5}/匹配首位是大写字母,后面4个是数字的字符串
锚:
^ 行首
$ 行尾
\A 字符串的开始
\z 字符串的结尾
\Z 字符串的结尾(不包括最后的换行符)
\b 单词边界
正则表达式创建:
r1 = Regexp.new('[Rr]uby') r2 = /[Rr]by/ # 这种写法类似于字符串数组的创建 r3 = %r{[Rr]uby}
正则表达式修饰符:
常用方法
-
正则匹配操作符=~ 与 !~
str = <<HERE Thie is a document. It contains a lot of date string like 2008-01-02 it's create at 2018-03-21 HERE # 正则表达式 r = /(\d{4})-(\d{2})-(\d{2})/
# 正则表达式 =~ 字符串 # 无法匹配时返回nil匹配成功则返回该字符串起始符位置 # !~与 =~相反,常用于条件判断 p r =~ str # $1包含的是正则表达式中从左侧开始的第一对小括号内的子模式所匹配的字符串 # 匹配时,是从外到内,从左到右的顺序 p $1 # => "2008" p $2 # => "01" p $3 # => "02" # 匹配部分前的字符串 p $` # => " Thie is a document.\n It contains a lot of date string like " # 匹配部分的字符串 # => "2008-01-02" p $& # 匹配部分后的字符串 p $' # => "\n it's create at 2018-03-21\n" -
Regexp的match方法
md = r.match(str) p md #=> #<MatchData "2008-01-02" 1:"2008" 2:"01" 3:"02"> p md.class # => MatchData p md[0] # => "2008-01-02" p md[1] # => "2008" p md[2] # => "01" p md[3] # => "02"
-
String类的scan方法
# 没有代码块的使用方法返回的是匹配结果数组 matches = str.scan(r) p matches # => [["2008", "01", "02"], ["2018", "03", "21"]] # 使用代码块对匹配的所有结果进行迭代 str.scan(r) do |year, month, day| puts "#{year}年#{month}月#{day}日" end # => 2008年01月02日 # => 2018年03月21日
-
sub,gsub方法
str = 'abc def g hi' p str.sub(/\s+/, '&') # => "abc&def g hi"(只替换第一个匹配项) p str.gsub(/\s+/, '&') # => "abc&def&g&hi"(替换所有匹配项)
参考: