首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用正则表达式和反向引用编写Ruby switch语句(case...when)?

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

Stack Overflow用户
提问于 2011-07-24 06:13:25
回答 2查看 42.4K关注 0票数 92

我知道我可以编写一个Ruby case语句来检查正则表达式是否匹配。然而,我想在我的return语句中使用匹配数据。类似于下面的半伪代码:

代码语言:javascript
复制
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类对其进行相应的解析。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-24 06:26:35

对最新正则表达式匹配组的引用始终存储在pseudo variables $1 to $9

代码语言:javascript
复制
case foo
when /^([0-9][0-9])/
    print "the month is #{$1}"
else
    print "something else"
end

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

代码语言:javascript
复制
case foo
when /^(?<number>[0-9][0-9])/
    print "the month is #{$LAST_MATCH_INFO['number']}"
else
    print "something else"
end
票数 161
EN

Stack Overflow用户

发布于 2011-07-24 06:41:50

下面是另一种方法,它可以得到相同的结果,但不使用开关。如果您将正则表达式放入数组中,则可以执行以下操作:

代码语言:javascript
复制
res = [ /pat1/, /pat2/, ... ]
m   = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.

在块外声明m允许它在find处理完块后仍然可用,并且一旦块返回真值,find就会停止,因此您可以获得与开关提供的相同的快捷方式行为。如果需要,这将为您提供完整的MatchData (也许您希望在正则表达式中使用命名捕获组),并将正则表达式与搜索逻辑很好地分开(这可能会产生更清晰的代码),您甚至可以从配置文件中加载正则表达式,或者在运行时选择所需的正则表达式集。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6803647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档