10

http://ruby-doc.org/core-1.9.3/Hash.html#method-i-include-3F

可以将 hash.has_key?(String) 转换为具有正则表达式搜索功能吗?

4

4 回答 4

11

我建议Hash使用新方法进行扩展,而不是替换has_key?.

class Hash
  def has_rkey?(search)
    search = Regexp.new(search.to_s) unless search.is_a?(Regexp)
    !!keys.detect{ |key| key =~ search }
  end
end

这将使用字符串、符号或正则表达式作为参数。

irb> h = {:test => 1}
 => {:test=>1}  
irb> h.has_rkey?(:te)
 => true 
irb> h.has_rkey?("te")
 => true 
irb> h.has_rkey?(/te/)
 => true 
irb> h.has_rkey?("foo")
 => false 
irb> h.has_rkey?(:foo)
 => false 
irb> h.has_rkey?(/foo/)
 => false 
于 2012-08-16T16:43:54.410 回答
8

我认为 usingany?是 qqbenq 所说的一个很好的解决方案,但我更喜欢使用它,grep因为它更简洁。

hash.keys.grep(/regexp/).any?
于 2016-12-22T17:44:46.277 回答
7

如果您只对是/否的答案感兴趣,那么any?可能是一个不错的选择:

hash.keys.any? { |key| key.to_s.match(regexp)}

whereregexp是一个正则表达式。

于 2015-09-04T10:58:30.137 回答
4

我不知道这个问题的绝对答案,但如果我要为此编写一个 hacky 方法,我会这样做

!!hash.keys.detect{ |k| k.to_s =~ /Your_Regex_here/ }

true当任何键与正则表达式匹配时,这将返回,false否则返回。

于 2012-08-16T16:44:17.880 回答