私は次のようなものを使用します:
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
その「タン」を実行させました。
私は長い正規表現を使用することをあまり信じていません。複雑なパターンを使用しようとしたコードをあまりにも多く維持する必要があり、何かが間違っていて、100% の確率で意図したことを達成できませんでした。それらは非常に強力ですが、コードのメンテナンスはそれを開発するよりもはるかに困難/悪いので、コードを維持するために私に従っている人たちに慈悲をかけて、私が書くパターンをスプーンサイズの断片に保つようにしています.