我在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
答案 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%的时间内完成预期的操作。它们非常强大,但代码的维护比开发它要困难得多,所以我试着保留我用勺子大小写的模式,怜悯那些跟着我维护代码的人。