Ruby从字符串中删除插值
我想删除求值的字符串插值 我有很多地方都有这样的代码,所以只有一个选择是将条件修改为unescape代码 我找到了一个运行良好的regexpRuby从字符串中删除插值,ruby,regex,Ruby,Regex,我想删除求值的字符串插值 我有很多地方都有这样的代码,所以只有一个选择是将条件修改为unescape代码 我找到了一个运行良好的regexp "\#{user.name}"[/[^\#{}]+/] 因此,我有了“user.name” 但这样的代码也会删除块中的大括号 "\#{[1,2,3].map { |el| el }.join(',')}"[/[^\#{}]+/] 返回 "[1,2,3].map " 预期结果是: "[1,2,3].map { |el| el }.join(',')"
"\#{user.name}"[/[^\#{}]+/]
因此,我有了“user.name”
但这样的代码也会删除块中的大括号
"\#{[1,2,3].map { |el| el }.join(',')}"[/[^\#{}]+/]
返回
"[1,2,3].map "
预期结果是:
"[1,2,3].map { |el| el }.join(',')"
有什么办法解决吗?在这种情况下,您可以使用
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(',')"
>reg=Regexp.new('\\\\{(?)}'))
=> /\#{(?.+)}/
>str1.gsub(reg){| match |$~[:content]}
=>“用户名”
>str2.gsub(reg){| match |$~[:content]}
=>“[1,2,3].映射{| el | el}.连接(',')”
您的示例效果不好,因为[^smth]
匹配的是列表中的任何单个字符,而不是整个句子
顺便说一句,我想提醒你,regexp可能适合简单的调整,但它总是有一些边缘情况。例如,我不确定上面的例子在插值内部的插值上会有什么表现
对于更复杂的情况,最好使用适当的lexer和parser
还有,要非常。。。非常小心地执行
eval
在这种情况下,您可以使用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(',')"
>reg=Regexp.new('\\\\{(?)}'))
=> /\#{(?.+)}/
>str1.gsub(reg){| match |$~[:content]}
=>“用户名”
>str2.gsub(reg){| match |$~[:content]}
=>“[1,2,3].映射{| el | el}.连接(',')”
您的示例效果不好,因为[^smth]
匹配的是列表中的任何单个字符,而不是整个句子
顺便说一句,我想提醒你,regexp可能适合简单的调整,但它总是有一些边缘情况。例如,我不确定上面的例子在插值内部的插值上会有什么表现
对于更复杂的情况,最好使用适当的lexer和parser
还有,要非常。。。非常小心地执行
eval
尝试您的_str[/#({(?:[^{}]++\g)*}/,1).gsub(/[{}]/,“”)
,请参见。如果这项操作的目标是使eval
安全,请不要费心。您基本上需要实现一个Ruby静态分析器才能真正做到这一点。请尝试您的\u str[/#({(?:[^{}]+++\g)*}/,1].gsub(/[{}]/,“”)
,请参见。如果这是为了使eval
安全,请不要费心。要真正做到这一点,您基本上需要实现一个Ruby静态分析器。