如何用正则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文件。