我會使用類似:
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%的時間。它們非常強大,但維護代碼比開發代碼更困難/更糟糕,所以我儘量保留用勺子大小寫的模式,憐憫那些跟着我維護代碼的人。
你的輸入文件是一個php文件嗎? – willoller
在這種情況下,這是肯定的 – user391986
我假設你需要保留評論和其他信息,所以在文件上運行php來做替換不會是一個選項。 – willoller