Ruby 正则表达式(二)

使用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"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值