使用quote方法的正则表达式
有时候我们想转义正则表达式中所有的元字符。而quote方法就可以实现。quote 方法会返回转义了的正则表达式字符串,然后在结合new方法,就可以生成新的正则表达式对象。
re1 = Regexp.new("abc*def")
re2 = Regexp.new(Regexp.quote("abc*def"))
p (re1 = ~ "abc*def") #=>nil
p (re2 =~ "abc*def") #=>0
正则表达式的选项
设定正则表达式的选项时,只需在/.../的后面指定即可,如/.../im,这里i以及m就是正则表达式的选项。
i 忽略英文字母大小写的选项。制定这个选项后,无论字符串中的字母是大写还是小写都会被匹配。
x 忽略正则表达式中的空白字符以及#后面的字符选项。指定这个选项后,我们就可以使用#在正则表达式中写注释了。
m 指定这个选项后,就可以使用 . 匹配换行符了。
str = "ABC\nDEF\nGHI"
P /DEF.GHI/ =~ str #=> nil
p /DEF.GHI/ =~ str #=> 4
Regexp.new方法中第二个参数可用于指定选项常量。只需要一个参数时,可不指定第2个参数或者直接指定nil。
例如,/Ruby脚本/i这一正则表达式,可以像下面这样写:
Regexp.new("Ruby脚本", Regexp::IGNORECASE)
另外,我们还可用 | 指定多个选项。这时,/Ruby脚本/im这一正则表达式就变成了下面这样:
Regexp.new("Ruby脚本", Regexp::IGNORECASE | Regexp::MULTILINE)
捕获
除了检查字符是否匹配外,正则表达式还有另外一个常用的功能,甚至可以说是比匹配更加重要的功能——捕获(向后引用)。
所谓捕获,就是从正则表达式的匹配部分提取其中的某部分。通过"$数字"这种形式的变量,就可以获取匹配了正则表达式中的用()括住的部分字符串。
/(.)(.)(.)/ =~ "abc"
first = $1
second = $2
third = $3
p first #=> "a"
p second #=> "b"
p third #=> "c"
在行进匹配的时候,我们只知道是否匹配、匹配第几个字符之类的信息。而使用捕获之后,我们就可以知道哪部分被匹配了。因此通过这个功能,我们就可以非常方便地对字符串进行分析。
()也被用于将多个模式整理为一个。在修改程序中的正则表达式时,如果改变了()的数量,那么将要引用的部分的索引也会随之改变,有时就会带来不方便。这种情况下,我们可以使用(?:)过滤不需要捕获的模式。
/(.)(\d\d)+(.)/ =~ "123456"
p $1 #=>"1"
p $2 #=>"45"
p $3 #=>"6"
/(.)(?:\d\d)+(.)/ =~ "123456"
p $1 #=>"1"
p $2 #=>"6"
除了“$数字”这种形式外,保存匹配结果的变量还有$`、$&、$',分别代表匹配部分前的字符串、匹配部分后的字符串。
/C./ =~ "ABCDEF"
p $` #=>"AB"
p $& #=>"CD"
p $' #=>"EF"