如何验证字符串是否包含有效的Ruby Symbol literal



我有一些字符串输入,我想验证它是否是一个有效的Ruby Symbol文字。如果是,那么将其转换为符号。否则返回传递的字符串。

,

def parse_symbol(str)
...          # Validate and convert to Symbol
# Return Symbol if valid Symbol literal
# Otherwise return str
end
input1 = ':foo_bar'   #=> Valid Symbol
parse_symbol(input1)  #=> :foo_bar
input2 = ':"foo bar"' #=> Valid Symbol
parse_symbol(input2)  #=> :"foo bar"
input3 = ':foo bar'   #=> Invalid
parse_symbol(input3)  #=> :foo bar
input4 = '::"foo_bar"'   #=> Invalid
parse_symbol(input4)  #=> ::"foo_bar"
...   # all other possible valid and invalid symbol literal goes here

str。to_sym #将每个字符串转换为符号形式

编辑

在这里使用eval是一个昂贵的工具吗?

eval(str).is_a (Symbol) rescue str

我建议使用真正的解析器。

require 'parser/current'
require 'minitest/autorun'
def parse_symbol(str)
ast = Parser::CurrentRuby.parse(str)
if ast.type == :sym
ast.children[0]
else
str
end
rescue Parser::SyntaxError
str
end
class TestAnswer < Minitest::Test
def test_1
assert_equal :foo_bar, parse_symbol(':foo_bar')
end
def test_2
assert_equal :"foo bar", parse_symbol(':"foo bar"')
end
def test_3
assert_equal ":foo bar", parse_symbol(':foo bar')
end
def test_4
assert_equal '::"foo_bar"', parse_symbol('::"foo_bar"')
end
end
def parse_symbol(str)
result = str.scan /^:(((@@|@|$)?[a-zA-Z_]+[a-zA-Z0-9_]*[!?]?)|($([:.><?!$\/'"@`~+;]|-w))|($[0-9]+)|(<|>|[])|"(.*)"|'(.*)')$/
return str unless !result.empty?
result[0].drop(1).each do |part|
return part.to_sym unless part.nil?
end
end

使用像这样的正则表达式

def parse_symbol(str)
if str ~= /:([^:s]+||"[^:]+")/
return str.to_sym
else
return str
end
end

eval在这里是一个昂贵的工具吗?

它可能不是那么昂贵,但是根据输入的来源,它可能是危险的。

相关内容

  • 没有找到相关文章

最新更新