Ruby从字符串中删除插值

时间:2018-11-20 12:36:50

标签: ruby regex

我想删除eval的字符串插值。

我在很多地方都有这样的代码,因此只有一种选择是将条件修改为不转义代码。

我找到了一个运行良好的正则表达式

"\#{user.name}"[/[^\#{}]+/]

结果,我有"user.name"

但是这样的代码也可以删除块中的花括号

"\#{[1,2,3].map { |el| el }.join(',')}"[/[^\#{}]+/]

返回

"[1,2,3].map "

预期结果是:

"[1,2,3].map { |el| el }.join(',')"

有什么办法解决吗?

1 个答案:

答案 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