如何检查字符串是否包含有效哈希

时间:2016-09-26 14:32:02

标签: ruby-on-rails ruby validation hash

当我想在输入字符串包含有效哈希值之前验证输入字符串时遇到问题,例如:

"{:key=>true}"如果我运行eval它返回一个正确的哈希值,但是如果我在这个字符串"{:key=>true"上运行eval,我会得到预期令牌的语法错误:

(eval):1: syntax error, unexpected end-of-input, expecting '}' {:redirect=>true ^

我确实尝试了一些基本的验证但到目前为止没有运气。

基本上我想知道的是如何验证字符串是否包含正确的哈希格式。

3 个答案:

答案 0 :(得分:4)

如果没有实际将其解析为Ruby,并且(假设您信任字符串),您无法分辨,解析它的最简单方法是简单地执行eval调用,并且处理异常

begin
  hash = eval(string)
rescue SyntaxError
  # It's not valid
end

这正是异常的原因,而不是乱丢代码,检查操作是否成功,只是执行操作,并处理发生的错误。

答案 1 :(得分:2)

要验证字符串,您可以使用Kernel#eval +检查类型:

def valid_hash?(string)
  eval(string).is_a?(Hash)
rescue SyntaxError
  false
end

用法:

string = "{:key=>true}"
valid_hash?(string)
#=> true
string = "I am not hash"
valid_hash?(string)
#=> false

答案 2 :(得分:0)

我有类似的问题,但我不喜欢eval解决方案,因为它不安全。

我使用了JSON gem并修改了字符串以匹配JSON语法。

假设您只有符号键。

  1. 'key: value''"key": value'
  2. ':key => value''"key": value'
  3. string1 = "{:key_1=>true,key_2:false}"
    string2 = "{:key=>true}"
    string3 = "no hash"
    
    def valid_hash?(string)
      begin
        string = string.gsub(/(\w+):\s*([^},])/, '"\1":\2')
        #=> "{:key_1=>true,\"key_2\":false}"
        string = string.gsub(/:(\w+)\s*=>/, '"\1":')
        #=> "{\"key_1\":true,\"key_2\":false}"
        my_hash = JSON.parse(string, {symbolize_names: true})
        #=> {:key_1=>true, :key_2=>false}
        my_hash.is_a? Hash # or do whatever you want with your Hash
      rescue JSON::ParserError
        false
      end
    end
    
    valid_hash? string1
    #=> true
    valid_hash? string2
    #=> true
    valid_hash? string3
    #=> false