我有一个包含多个键的哈希值和一个字符串,其中包含哈希中的无键或其中一个键。
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 (^&*$#@!^&&*))"
检查s
中h
是否包含h
中的任何键的最佳方法是什么?如果是,请返回其中包含的键的值?
例如,对于s
和v1
的上述示例,输出应为{{1}}。
编辑:只有字符串是用户定义的。哈希值始终相同。
答案 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"