2010-10-22 47 views
2

考虑下面的字符串,可以在一个文件中的C程序段:为什么这个Ruby不像预期的那样替换正则表达式?

strcat(errbuf,errbuftemp); 

我想用前缀G->加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不重新插入回用替换表达式。

任何人都可以指出我做错了什么?

回答

3

因为您必须使用语法gsub(/.../){"...#{$1}...#{$2}..."}gsub(/.../,'...\1...\2...')

这里是同样的问题:werid, same expression yield different value when excuting two times in irb

的问题是,变量$ 1插值到参数字符串运行GSUB之前,即$ 1之前的值是什么符号被替换为。你可以用'\ 1?'替换第二个参数以达到预期的效果。 (恰克)

+0

权上,通过您所提供的线索看,并想出了: 提出line.gsub(/([\ t \ n \ r(),\\ [ \\]] {1})#{item}([\ t \ n \ r(),\\ [\\]] {1})/){“#{$ 1} G \ - >#{item} #{$ 2}“} – Theo 2010-10-22 05:37:53

0

我认为问题的一部分是()使用GSUB代替子()。

这里有两名候补:

str = 'strcat(errbuf,errbuftemp);' 

str.sub(/\w+,/) { |s| 'G->' + s } # => "strcat(G->errbuf,errbuftemp);" 
str.sub(/\((\w+)\b/, '(G->\1') # => "strcat(G->errbuf,errbuftemp);" 
+0

如果我在输入字符串中反转errbuf和errbuftemp,你的代码会将G->追加到errbuftemp而不是errbuf。我正在寻找忽略errbuftemp并仅处理errbuf - 因此在我的原始正则表达式之前和之后偷看角色。 请注意,您花了一些时间来提供答案的事实。 – Theo 2010-10-22 05:51:06

+0

啊,这不是问题的先决条件。我有一个符合errbuf的样本。检查#1编辑,你应该看到它。 – 2010-10-22 19:05:01

相关问题