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

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

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

我怎样才能做到这一点?

谢谢!


只是一个说明:我明白,我不会像以上那样使用switch语句来处理一个简单的情况,但这只是一个例子。 实际上,我想要实现的是为许多潜在的正则expression式匹配一个可以用各种方式编写的date,然后相应地用Ruby的Date类进行parsing。

对最新的正则expression式匹配组的引用总是存储在伪variables $1$9

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

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

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

这里有一个替代方法可以得到相同的结果,但不使用开关。 如果你把你的正则expression式放在一个数组中,你可以这样做:

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

在块之外声明m允许块在find完成后仍然可用,一旦块返回真值, find将立即停止,从而获得与交换机相同的捷径行为。 如果你需要的话,这可以给你完整的MatchData (也许你想在你的正则expression式中使用命名的捕获组),并很好地将你的正则expression式从你的search逻辑中分离出来(这可能会产生更清晰的代码),甚至可以加载你的正则expression式一个configuration文件或者在运行时select你想要的configuration文件。