1

配列に対して複数の正規表現の置換を行いたいのですが、この動作するコードがありますが、それはルビーウェイではないようです、より良い解決策を持っている人はいますか?

#files contains the string that need cleaning
files = [
   "Beatles - The Word ",
  "The Beatles - The Word",
  "Beatles - Tell Me Why",
  "Beatles - Tell Me Why (remastered)",
  "Beatles - Love me do"
]

#ignore contains the reg expr that need to bee checked
ignore = [/the/,/\(.*\)/,/remastered/,/live/,/remix/,/mix/,/acoustic/,/version/,/  +/]

files.each do |file|
  ignore.each do |e|
    file.downcase!
    file.gsub!(e," ")
    file.strip!
  end
end
p files
#=>["beatles - word", "beatles - word", "beatles - tell me why", "beatles - tell me why", "beatles - love me do"]
4

3 に答える 3

3
ignore = ["the", "(", ".",  "*", ")", "remastered", "live", "remix",  "mix", "acoustic", "version", "+"]
re = Regexp.union(ignore)
p re #=> /the|\(|\.|\*|\)|remastered|live|remix|mix|acoustic|version|\+/

Regexp.union脱出の世話をします。

于 2012-04-30T10:05:25.383 に答える
1

これらのほとんどを単一の正規表現置換操作に入れることができます。また、単語境界アンカー()を使用する必要があります。そうしないと\b、たとえば、theにも一致しThere's a Placeます。

file.gsub!(/(?:\b(?:the|remastered|live|remix|mix|acoustic|version)\b)|\([^()]*\)/, ' ')

これの世話をする必要があります。

次に、2番目のステップで複数のスペースを削除できます。

file.gsub!(/  +/, ' ')

正規表現を配列に保持する場合は、配列を反復処理して、各正規表現の置換を行う必要があります。ただし、少なくともいくつかのコマンドをループから外すことができます。

files.each do |file|
  file.downcase!
  ignore.each do |e|
    file.gsub!(e," ")
  end
  file.strip!
end

もちろん、無視リストの各単語の周囲に単語の境界を設定する必要があります。

ignore = [/\bthe\b/, /\([^()]*\)/, /\bremastered\b/, ...]
于 2012-04-30T09:40:20.137 に答える
0

私はあなたの答えからこの解決策を作りました、2つのバージョン、1つは文字列への変換(ファイル配列を変更しません、もう1つはファイル配列自体を変更するArrayの拡張を使用します。クラスの承認は2倍高速です。提案があります、それらを共有してください。

files = [
   "Beatles - The Word ",
  "The Beatles - The Word",
  "Beatles - Tell Me Why",
  "The Beatles - Tell Me Why (remastered)",
  "Beatles - wordwiththein wordwithlivein"
]

ignore = /\(.*\)|[_]|\b(the|remastered|live|remix|mix|acoustic|version)\b/

class Array
  def cleanup ignore
    self.each do |e|
      e.downcase!
      e.gsub!(ignore," ")
      e.gsub!(/  +/," ")
      e.strip!
    end
  end
end

p files.join("#").downcase!.gsub(ignore," ").gsub(/  +/," ").split(/ *# */)
#=>["beatles - word", "beatles - word", "beatles - tell me why", "beatles - tell me why", "beatles - wordwiththein wordwithlivein"]

Benchmark.bm do |x| 
  x.report("string method")  { 10000.times { files.join("#").downcase!.gsub(ignore," ").gsub(/  +/," ").split(/ *# */) } }
  x.report("class  method")   { 10000.times { files.cleanup ignore } }
end

=begin
       user     system      total        real
string method  0.328000   0.000000   0.328000 (  0.327600)
class  method  0.187000   0.000000   0.187000 (  0.187200)
=end
于 2012-04-30T11:52:48.483 に答える