如何用正则表达式和反向引用来编写Ruby switch语句(case ... when)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我知道我可以写一个Ruby case语句来检查正则表达式的匹配。但是,我想在我的return语句中使用匹配数据。像这样的半伪代码:

foo = "10/10/2011"

case foo
    when /^([0-9][0-9])/
        print "the month is #{match[1]}"
    else
        print "something else"
end

我怎样才能做到这一点?

提问于
用户回答回答于

对最新的正则表达式匹配组的引用始终存储在伪变量

从$1到$9:

case foo
when /^([0-9][0-9])/
    print "the month is #{$1}"
else
    print "something else"
end

也可以使用$LAST_MATCH_INFO伪变量来获取整个MatchData对象。这在使用命名捕获时很有用:

case foo
when /^(?<number>[0-9][0-9])/
    print "the month is #{$LAST_MATCH_INFO['number']}"
else
    print "something else"
end
用户回答回答于

这是一种替代方法,可以获得相同的结果。如果你把正则表达式放在一个数组中,你可以这样做:

res = [ /pat1/, /pat2/, ... ]
m   = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.

扫码关注云+社区