检查字符串是否包含散列中的任何键,并返回其包含的键的值

时间:2015-04-21 04:26:15

标签: ruby string hash

我有一个包含多个键的哈希值和一个字符串,其中包含哈希中的无键或其中一个键。

h = {"k1"=>"v1", "k2"=>"v2", "k3"=>"v3"}
s = "this is an example string that might occur with a key somewhere in the string k1(with special characters like (^&*$#@!^&&*))"

检查sh是否包含h中的任何键的最佳方法是什么?如果是,请返回其中包含的键的值?

例如,对于sv1的上述示例,输出应为{{1}}。

编辑:只有字符串是用户定义的。哈希值始终相同。

2 个答案:

答案 0 :(得分:5)

我发现这种方式可读:

hash_key_in_s = s[Regexp.union(h.keys)]
p h[hash_key_in_s] #=> "v1"

或者在一行中:

p h.fetch s[Regexp.union(h.keys)] #=> "v1"

这是一个不使用regexp的版本:

p h.fetch( h.keys.find{|key|s[key]} ) #=> "v1"

答案 1 :(得分:3)

使用哈希h密钥创建正则表达式,并在字符串中创建match

h[s.match(/#{h.keys.join('|')}/).to_s]
# => "v1"

或者Amadan建议使用Regexp#escape来保证安全:

h[s.match(/#{h.keys.map(&Regexp.method(:escape)).join('|')}/).to_s]
# => "v1"

如果String s间隔均匀,我们也可以这样做:

s =  "this is an example string that might occur with a key somewhere in the string k1 (with special characters like (^&*$\#@!^&&*))"
h[(s.split & h.keys).first]
# => "v1"