我可以为Ruby的MatchData设置默认值吗?

时间:2017-07-13 07:19:15

标签: ruby regex

在Hash中,我可以使用

map = Hash.new("(0,0)")

map = Hash.new()
map.default = "(0, 0)"

为未定义的键设置默认值,这样当我尝试检索未定义键的值时,我不会收到错误。但是在MatchData中,例如,在:

line = "matchBegins\/blabla\" = (20, 10);"
get = line.match(/matchBegins\/(?<match1>\D*)" *= *(?<match2>.*);/)
puts get[:notExisted]

我会收到错误。我已经检查了MatchData的文档,但是没有设置默认值的任何内容。我对么?感谢

1 个答案:

答案 0 :(得分:0)

如果您使用的是Ruby 2.4+,则可以使用'named_captures':

line = "matchBegins\/blabla\" = (20, 10);"
get = line.match(/matchBegins\/(?<match1>\D*)" *= *(?<match2>.*);/)
hash = get.named_captures

这是Hash(带有字符串键!),您可以使用fetch指定默认值:

hash.fetch('unknownKey', 'default')

如果您使用的是Ruby 1.9.1+,则可以使用namescaptures构建哈希:

line = "matchBegins\/blabla\" = (20, 10);"
get = line.match(/matchBegins\/(?<match1>\D*)" *= *(?<match2>.*);/)
hash = Hash[get.names.zip(get.captures)]

或者只是解救异常:

value = get['unknownKey'] rescue 'default'

(我觉得很难看,这样的代码可能会掩盖其他错误)

但是,说实话,我想知道你的用例是什么。为什么需要从MatchData请求任意密钥?