AKA 如何使用正则表达式找到未转义的字符序列?
给定一个环境设置:
@secret = "OH NO!"
$secret = "OH NO!"
@@secret = "OH NO!"
并给定从文件中读取的字符串,如下所示:
some_str = '"\"#{:NOT&&:very}\" bad. \u262E\n#@secret \\#$secret \\\\#@@secret"'
我想将其评估为 Ruby 字符串,但没有插值。因此,结果应该是:
puts safe_eval(some_str)
#=> "#{:NOT&&:very}" bad. ☮
#=> #@secret #$secret \#@@secret
相比之下,eval
-only 解决方案产生
puts eval(some_str)
#=> "very" bad. ☮
#=> OH NO! #$secret \OH NO!
起初我试过:
def safe_eval(str)
eval str.gsub(/#(?=[{@$])/,'\\#')
end
但这在上面的恶意中间情况下失败了,产生:
#=> "#{:NOT&&:very}" bad. ☮
#=> #@secret \OH NO! \#@@secret