我想删除eval的字符串插值。
我在很多地方都有这样的代码,因此只有一种选择是将条件修改为不转义代码。
我找到了一个运行良好的正则表达式
"\#{user.name}"[/[^\#{}]+/]
结果,我有"user.name"
但是这样的代码也可以删除块中的花括号
"\#{[1,2,3].map { |el| el }.join(',')}"[/[^\#{}]+/]
返回
"[1,2,3].map "
预期结果是:
"[1,2,3].map { |el| el }.join(',')"
有什么办法解决吗?
答案 0 :(得分:2)
在这种情况下,您可以使用gsub
并命名为regex
> reg = Regexp.new('\\#{(?<content>.+)}')
=> /\#{(?<content>.+)}/
> str1.gsub(reg) { |match| $~[:content] }
=> "user.name"
> str2.gsub(reg) { |match| $~[:content] }
=> "[1,2,3].map { |el| el }.join(',')"
您的示例效果不佳,因为[^smth]
与列表中的单个字符而不是整个句子匹配。
顺便说一句,我想警告您,regexp可能适合简单的调整,但是它总是有一些边缘情况。我不确定上面的示例在插值内部如何进行插值。
对于更复杂的情况,最好使用适当的词法分析器和解析器。
也要非常……非常小心做eval