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