Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby从字符串中删除插值_Ruby_Regex - Fatal编程技术网

Ruby从字符串中删除插值

Ruby从字符串中删除插值,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(',')"

我想删除求值的字符串插值

我有很多地方都有这样的代码,所以只有一个选择是将条件修改为unescape代码

我找到了一个运行良好的regexp

"\#{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静态分析器。