ruby - 评估不带字符串插值的字符串

标签 ruby regex eval

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解决方案会产生

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

最佳答案

您可以通过正则表达式来完成此操作,方法是确保要转义的字符之前有偶数个反斜杠:

def safe_eval(str)
  eval str.gsub( /([^\\](?:\\\\)*)#(?=[{@$])/, '\1\#' )
end

...上面写着:

  • 查找不是反斜杠的字符[^\\]
  • 后跟两个反斜杠(?:\\\\)
    • 重复零次或多次*
  • 后跟文字 # 字符
  • 并确保之后您可以看到 {@$ 字符。
  • 并将其替换为
    • 非反斜杠后可能跟随偶数个反斜杠
    • 然后是反斜杠,然后是 #

关于ruby - 评估不带字符串插值的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695890/

相关文章:

PERL5.26.1 带插值的 eval tr 运算符(camel book 第 76 页的示例)不起作用

ruby - 简介 Jekyll 构建时间

ruby-on-rails - 如何使用语义 UI 设置 Rails 应用程序?

ruby - 如何使用 bundler 创建相互依赖的 gem,并使用存储库作为源?

java - 从字符串中删除多余的零

regex - 找到包含字母表 {a, b} 上的子字符串 aba 的字符串的正则表达式? (形式语言理论)

python - 如果在 HTML 页面中找不到文本,如何在 python 中打印空值?

javascript - 评估和提示并发症

ruby-on-rails - 连接被拒绝 - 连接(2) "localhost"端口 9200 与 DigitalOcean

javascript - 摆脱 Javascript 中的困境