我知道我可以编写一个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
我怎样才能做到这一点呢?
谢谢!
注意:我知道我永远不会在上面的简单情况下使用switch语句,但这只是一个例子。实际上,我试图实现的是为一个日期匹配许多潜在的正则表达式,然后用Ruby的date类对其进行相应的解析。
发布于 2011-07-24 06:26:35
对最新正则表达式匹配组的引用始终存储在pseudo variables $1
to $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
发布于 2011-07-24 06:41:50
下面是另一种方法,它可以得到相同的结果,但不使用开关。如果您将正则表达式放入数组中,则可以执行以下操作:
res = [ /pat1/, /pat2/, ... ]
m = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.
在块外声明m
允许它在find
处理完块后仍然可用,并且一旦块返回真值,find
就会停止,因此您可以获得与开关提供的相同的快捷方式行为。如果需要,这将为您提供完整的MatchData
(也许您希望在正则表达式中使用命名捕获组),并将正则表达式与搜索逻辑很好地分开(这可能会产生更清晰的代码),您甚至可以从配置文件中加载正则表达式,或者在运行时选择所需的正则表达式集。
https://stackoverflow.com/questions/6803647
复制相似问题