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