lionheart 发表于 2013-2-5 01:27:52

ruby正则表达式学习

一、Regexp类的一些方法:
    Regexp.new/compile (string/regexp,]) : 构造一个正则表达式对象。第一个参数是一个字符串或者正则表达式;第二个参数是 正则表达式修饰符的按位OR。
    Regexp.escape/quote (string) : 对正则表达式中的特殊字符进行转义。如:
Regexp.escape('\\*?{}.')   #=> \\\\\*\?\{\}\. rxp.match(str) : 返回一个表示匹配结果的MatchData对象。如果没有匹配则返回nil
str = "a123b456c789"refs = /(a\d+)(b\d+)(c\d+)/.match(str)puts refs   # "a123b456c789" puts refs# ["a123","b456","c789"]refs.to_a.each {x| x}   # MatchData对象不是数组,在进行迭代前要调用to_a方法将其转换为一个数组。 也可以使用全局变量$1,$2等引用匹配结果:
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")puts "'#$1','#$2','$3'"# 'a123','b456','c789'在sub、gsub等方法中, 不能使用$1等来引用结果,因为这些参数在调用方法前就已经计算好。这时,可以采用特殊编码\1,\2等:
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")puts "'#$1','#$2','$3'"# 'a123','b456','c789'"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, '1st=\1, 2nd=\2, 3rd=\3')   # 1st=a123, 2nd=b456, 3rd=c789"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, "1st=\\1, 2nd=\\2, 3rd=\\3")   # 1st=a123, 2nd=b456, 3rd=c789# 上面两个sub方法中,第一个使用的是单引号;第二个是双引号,需要使用双语义MatchData对象还有以下一些有用的方法:
1. begin(n): 返回第n个匹配开头的偏移量
2. end(n): 返回第n个匹配结束的偏移量(等于第n+1个匹配的开头偏移量)
3. offset(n): 返回一个包含第n个匹配开头和结束偏移量的数组
4. pre_match: 返回匹配子字符串前面的字符串部分
5. post_match: 返回匹配子字符串后面的字符串部分
 
 
二、一些常用的标记
1.  ^ 和 $  : 行或字符串开头/结尾(注意:匹配单行的行头/行尾)。
src = "abc\ndef\nghi"/^abc/ =~ src#0/^def/ =~ src   #4/def$/ =~ src   #4/ghi$/ =~ src#82. \A 和 \Z : 整个字符串的开头/末尾或最后的换行符前
     \z : 基本同 \Z,但是不能匹配最后的换行符
src = "abc\ndef\nghi"/\Aabc/ =~ src#0/\Adef/ =~ src   #nil/def\Z/ =~ src   #nil/ghi\Z/ =~ src#8/ghi\z/ =~ src#8src << "\n"/ghi\Z/ =~ src#8/ghi\z/ =~ src#nil3. \b : 单词边界(在[]外); \B : 非单词边界
src = "this is a test"src.gsub(/\b/, '|')# "|this| |is| |a| |test|"src.gsub(/\B/, '-')# "t-h-i-s i-s a t-e-s-t"4. {?=}: 正预查 ,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串匹配时,sub才匹配成功;{?!}: 负预查,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串不匹配时,sub才匹配成功。
/(a\d+)(?=b)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789'] /(a\d+)(?=c)(b\d+)(c\d+)/.match("a123b456c789")    # nil /(a\d+)(?=b)(\d+)(c\d+)/.match("a123b456c789")   # nil /(a\d+)(?!c)(b\d+)(c\d+)/.match("a123b456c789")    # ['a123','b456','c789'5. () : 子表达式编组; (?:) : 非捕获组
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")puts "'#$1','#$2','$3'"# 'a123','b456','c789'refs = /(a\d+)(?:b\d+)(c\d+)/.match("a123b456c789")puts "'#$1','#$2','$3'"# 'a123','c789','nil'6. 字符类:包括在方括号[]中的一组字符,其中每一个子匹配是任意一个字符。
    (1) ^用于字符类的开头时有特殊意义,它对字符列表取反。
    (2) 像.和?之类的元字符在字符类中没有特殊含义,表示自身代表的字符。而\n这样的转义序列仍然有效。
    (3) 连字符-用于字符类的开头或结尾,脱字符^用于字符类的中间时,没有特殊含义,只表示自身;左括号[和右括号]用于字符类中时,也是如此,而且还必须显示进行转义。
// =~ "abcd"   #0/[^abc]/ =~ "abcd"   #3/[.?abc]/ =~ ".?"   #0/[-^\[\]]/ =~ "^" #0      7. 几个修饰符的介绍
           (1) i   :  正则表达式不区分大小写
           (2) o  :  只执行一次表达式替换
           (3) m  :  多行模式(句点匹配换行)
           (4) x   :  扩展正则表达式(允许空白、注释)
 
 
三、一些常用正则表达式实例
1. 匹配IP地址
num = /\d|?\d\d|2\d|25/ip = /^(#{num}\.){3}#{num}$/ip =~ '192.168.0.50'# 0ip =~ '192.168.0.500'# nil2. 匹配email地址
before_at = /(+(_?)+)/after_at = /+(-?)+(\.+)+/email = /^(#{before_at}@#{after_at})$/email =~ 'abc_123@xyz.com.cn' #0email =~ 'abc_123@xyz.com' #0email =~ 'abc_@xyz.com.cn' #nilemail =~ 'abc_123@xy-z.com.cn' #0email =~ 'abc_123@xyz-.com.cn' #nil3. 匹配时间/日期类型(yyyy.mm.dd hh:mm:ss)
yyyy = /\d\d\d/mm = /0?|1/dd = /0?|\d|3/hh = /?|2/MM = /\d/ss = /\d/date_time = /^(#{yyyy}\.#{mm}\.#{dd}) (#{hh}:#{MM}:#{ss})$/date_time =~ '2008.8.27 22:12:10'# 0date_time =~ '2008.8.27 22:12:60'# nil 
页: [1]
查看完整版本: ruby正则表达式学习