0

私はruby変数に大きなファイルを持っています、それは次のような一般的なパターンに従います:

// ...

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

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

// ...

「値」を「キー」に置き換えようとしています

これは文字列全体を置き換えます。どうすれば修正できますか?私が考えたもう1つの方法は、2つのステップでそれを行うことです。ステップ1は、引用符内の値を見つけてから、文字列の置換を実行することです。

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

2 に答える 2

1

.*貪欲で、可能な限り消費します (最後の最後まですべて')。そうなると.[^']最初の締め切りを超えることは不可能です'

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

また、置き換えられる値を除くすべてをキャプチャするために括弧を追加しました。括弧の最初のセットは に対応し\1、2 番目の括弧は に対応し\2ます。したがって、これの一致を次のように置き換えます。

"\1yournewvaluehere\2"
于 2012-11-08T00:34:01.857 に答える
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一致したものがブロックの戻り値に置き換えられることを意味するため、「ヒット」を置き換える文字列を作成し、gsubその「タン」を実行させました。

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

于 2012-11-08T01:10:42.417 に答える