ruby找到并替换字符串的一部分

时间:2012-11-08 00:32:26

标签: ruby regex

我在ruby变量中有一个大文件,它遵循一个常见的模式:

// ...

// comment
$myuser['bla'] = 'bla';

// comment
$myuser['bla2'] = 'bla2';

// ...

我试图用'key'代替'value'

这会替换整个字符串,如何解决?我认为另一种方法是分两步完成,第一步是在引号内找到值然后执行字符串替换,什么是最好的?

def keyvalr(content, key, value)
    return content.gsub(/\$bla\[\'#{key}\'\]\s+\=\s+\'(.*)\'/) {|m| value }
end

2 个答案:

答案 0 :(得分:1)

.*贪婪并且消耗尽可能多(直到最后')。将.设为[^'],然后它就不可能超过第一个结束'

/(\$bla\[\'#{key}\'\]\s+\=\s+\')[^']*(\')/

我还添加了括号以捕获除要替换的值之外的所有内容。第一组parens将对应\1,第二组对应\2。因此,您将其替换为:

"\1yournewvaluehere\2"

答案 1 :(得分:0)

我使用类似的东西:

text = %q{
// ...

// comment
$myuser['bla'] = 'bla';

// comment
$myuser['bla2'] = 'bla2';

// ...
}

from_to = {
  'bla'  => 'foo',
  'bla2' => 'bar'
}

puts text.gsub(/\['([^']+)'\] = '([^']+)'/) { |t|
  key, val = t.scan(/'([^']+)'/).flatten
  "['%s'] = '%s'" % [ key, from_to[key] ]
}

哪个输出:

// ...

// comment
$myuser['bla'] = 'foo';

// comment
$myuser['bla2'] = 'bar';

// ...

这是它的工作原理:

如果我这样做:

puts text.gsub(/\['([^']+)'\] = '([^']+)'/) { |t|
  puts t
}

我明白了:

['bla'] = 'bla'
['bla2'] = 'bla2'

然后我尝试了:

"['bla'] = 'bla'".scan(/'([^']+)'/).flatten
=> ["bla", "bla"]

这给了我一个关键,"价值"对,所以我可以使用哈希来查找替换值。

将它粘贴在gsub块内意味着匹配的任何匹配被我的块的返回值替换,所以我创建了一个字符串来替换" hit"然后让gsub执行" thang"。

我并不是使用长正则表达式的忠实信徒。我不得不维护过多的代码,试图使用复杂的模式,并且出错了,并且无法在100%的时间内完成预期的操作。它们非常强大,但代码的维护比开发它要困难得多,所以我试着保留我用勺子大小写的模式,怜悯那些跟着我维护代码的人。