在Ruby gsub调用块替换时使用变量的困难

在Ruby gsub调用块替换时使用变量的困难,ruby,regex,Ruby,Regex,我试图完成的是以模板方式替换一块文本(不是以新行结尾)。我要替换的块看起来像这样(为了让它更可读,我在块括号中放了变量值): 我想替换所有东西,包括第一个varA和最后一个varC 我将正则表达式的一个骨架放在一起,以匹配这个。因此,假设varA为“”,则正则表达式需要为: /<%block_beg%>(.*)<%block_end%>/m/ 代码以静默方式运行,不会抛出错误,但也不会替换任何内容。有人能告诉我为什么这不起作用吗?我应该采取不同的方法吗 后注1:@是由于

我试图完成的是以模板方式替换一块文本(不是以新行结尾)。我要替换的块看起来像这样(为了让它更可读,我在块括号中放了变量值):

我想替换所有东西,包括第一个varA和最后一个varC

我将正则表达式的一个骨架放在一起,以匹配这个。因此,假设varA为“”,则正则表达式需要为:

/<%block_beg%>(.*)<%block_end%>/m/
代码以静默方式运行,不会抛出错误,但也不会替换任何内容。有人能告诉我为什么这不起作用吗?我应该采取不同的方法吗

后注1:@是由于变量是类属性这一事实造成的

贴注2:我已经修复了一些东西,但它仍然不工作。我现在有:

 @content.gsub(/#{Regexp.escape(@varA)}#{Regexp.escape(@varB)}_beg#{Regexp.escape(@varC)}(.*)#{Regexp.escape(@varA)}#{Regexp.escape(varB)}_end#{Regexp.escape(@varC)}/m)

有人知道为什么不行吗?

你的
gsub
看起来不太对劲。我会这样做:

old_str.gsub(/#{varA}#{varB}_begin#{varC}(.*)#{varA}#{varB}_end#{varC}/m)

另外,如果变量是字符串,您可能希望首先对它们调用
Regexp.escape
,以便它们作为文本字符串而不是Regexp指令进行匹配。

从技术上讲,在我正在处理的特定实例中,它们都应该有@,因为它们是一个类的属性。我建议重构并替换你想要用散列插值的IVAR。然后,只需在散列中迭代,并使用value对每个键进行gsub。首先,创建regexp并将其分配给变量,然后
p myregexp
。查看您实际运行的正则表达式。我猜您的实例变量是
nil
,它的
#to_s
是一个空字符串,因此您的正则表达式是
/\u beg(.*)\u end/m
。第二个参数在您的
gsub
中的后注2中丢失。请参阅对我的原始帖子的修订(后注1和2)。。还有问题吗
 @content.gsub(/#{Regexp.escape(@varA)}#{Regexp.escape(@varB)}_beg#{Regexp.escape(@varC)}(.*)#{Regexp.escape(@varA)}#{Regexp.escape(varB)}_end#{Regexp.escape(@varC)}/m)
old_str.gsub(/#{varA}#{varB}_begin#{varC}(.*)#{varA}#{varB}_end#{varC}/m)