我会使用类似的东西:
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
块内意味着匹配的任何内容都被我的块返回值替换,所以我创建了一个字符串来替换“命中”并让它gsub
做它的“thang”。
我不太相信使用长正则表达式。我不得不维护太多试图使用复杂模式的代码,并且出现了一些错误,并且未能在 100% 的时间内完成预期的任务。它们非常强大,但代码的维护比开发它更难/更糟糕,所以我尝试将我编写的模式保持在勺子大小的块中,对那些跟随我维护代码的人怜悯。