我有一些字符串输入,我想验证它是否是一个有效的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
在这里是一个昂贵的工具吗?
它可能不是那么昂贵,但是根据输入的来源,它可能是危险的。