2015-04-21 18 views
5

Birden fazla tuşa sahip bir karma veriye ve karmada hiçbiri veya anahtarlardan birini içeren bir dizeye sahibim. Bir dizgenin bir karede herhangi bir anahtar içerip içermediğini ve içerdiği anahtarın değerini döndürüp döndürmediğini kontrol edin

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 (^&*$#@!^&&*))" 

Ne s h anahtarlardan herhangi birine içerir ve eğer olursa, içerdiği bu anahtarın değerini dönerseniz kontrol etmenin en iyi yolu olurdu? Örneğin, h ve s'un yukarıdaki örnekleri için, çıktı v1 olmalıdır.

Düzenleme: Yalnızca dize kullanıcı tanımlı olur. Karma her zaman aynı olacaktır. güvenliği için Regexp#escape kullanarak önerdi

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

Veya Amadan olarak:

cevap

5

Ben okunabilir bu yol bulmak:

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

Veya tek satırda:

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

Üçüncü seçeneği gerçekten seviyorum - Teşekkürler! – Sid

+0

Bir şekilde cevabınızı daha önce kaçırdım. –

3

Hash dışına dizesinde h tuşları ve match bir regex oluşturmak dize s eşit aralıklı olsaydı

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

, yapabiliriz Bunun gibi bir şey yaptık:

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" 
+4

'h.keys.map (: Burada

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

Ve Regexp'i kullanmayan bir versiyonudur & Regexp.method (: escape)), anahtarlar gerçekte regexps olmadıkça güvenlik için ('|') 'a katılın. – Amadan

+0

evet, daha iyisi, teşekkürler :) – shivam

+0

İlk önce 'key' 'i almalısın, daha sonra' h 'anahtarının' nil' değilse 'h [key]' almasını sağlayın. 'Join' kullanmak yerine (ki bu iyi), ilk adımı şu şekilde yapabilirsiniz: 'key = s [Regexp.union (h.keys.map (& Regexp.method (: escape)))] =>" k1" '. Bir şey daha: güzel cevap! –

İlgili konular