当我想在输入字符串包含有效哈希值之前验证输入字符串时遇到问题,例如:
"{:key=>true}"
如果我运行eval它返回一个正确的哈希值,但是如果我在这个字符串"{:key=>true"
上运行eval,我会得到预期令牌的语法错误:
(eval):1: syntax error, unexpected end-of-input, expecting '}' {:redirect=>true ^
我确实尝试了一些基本的验证但到目前为止没有运气。
基本上我想知道的是如何验证字符串是否包含正确的哈希格式。
答案 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语法。
假设您只有符号键。
'key: value'
至'"key": value'
':key => value'
至'"key": value'
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