考虑以下字符串,它是文件中的C片段:
strcat(errbuf,errbuftemp);
我想用前缀g->plus errbuf替换errbuf(但不是errbuftemp)。为了成功地完成这项工作,我检查errbuf之前的字符和之后的字符,看看它是否在批准的字符列表中,然后执行替换。
我创建了以下ruby文件:
line = " strcat(errbuf,errbuftemp);"
item = "errbuf"
puts line.gsub(/([ \t\n\r(),\[\]]{1})#{item}([ \t\n\r(),\[\]]{1})/, "#{$1}G\->#{item}#{$2}")
预期结果:
strcat(G->errbuf,errbuftemp);
实际结果
strcatG->errbuferrbuftemp);
基本上,errbuf前后的匹配字符不会用replace表达式重新插入。
谁能指出我做错了什么?
最佳答案
因为必须使用语法gsub(/.../){"...#{$1}...#{$2}..."}
或gsub(/.../,'...\1...\2...')
。
这里有同样的问题:werid, same expression yield different value when excuting two times in irb
问题是,在运行gsub之前,变量$1被插入到参数字符串中,这意味着$1的前一个值就是符号被替换的值。您可以将第二个参数替换为“\1?”以达到预期的效果。(恰克·巴斯)