2016-08-19 6 views
0

文字列のキーワードを選択してRubyでフォーマットを変更します 大きな文字列(テキスト)と以下のような文字列(key_words):Rubyでフォーマットを変更する文字列(配列に含まれる)のキーワードを選択する

text = 'So in this election, we cannot sit back and hope that everything works out for the best. We cannot afford to be tired or frustrated or cynical. No, hear me. Between now and November, we need to do what we did eight years ago and four years ago…' 
key_words = ['frustrated', 'tired', 'hope'] 

私の目的は、key_wordsに含まれる単語の色とケースを変えながら「テキスト」の各単語を印刷することです。

require 'colorize' 
text.split(/\b/).each do |x| 
    if key_words.include?(x.downcase) ; print '#{x}'.colorize(:red) 
    else print '#{x}' end 
end 

しかし、私は私が完全に一致越え選択をより敏感にしたいkey_wordsに多くの単語を含めるようにしたくないので、私は実行していることを行うことができました。このような場合と同様に、例えば:

key_words = ['frustrat', 'tire', 'hope'] => the algorithm would select both 'Frustration', 'Frustrated' or 'Tiring' and 'Tired' or 'Hope' and 'Hopeful'. 

私は以下のように文字列と配列の両方でワード長で遊んでみましたが、それはだ非常に非効率的な解決策と私はの使用に非常に混乱しそうだと思われます。どれか?および。このシナリオのメソッド。

key_words = ['frustrated', 'tired', 'hope'] 
key_words_abb = [] 
key_words.each { |x| key_words_abb << x.downcase[0][0..x.length-2]} 
text.split(/\b/).each do |x| 
    if key_words_abb.include?(x.downcase[0][0..x.length-2]); print '#{x}'.colorize(:red) 
    else print x 
    end 
end 

私は特定の解決策をオンラインで見つけることができないので、私はあなたの助けに感謝します。

+0

ようこそスタックオーバーフロー!あなたが書式設定してスクロールしないように手伝ってください。 – zhon

+0

Rubyには 'colorize'メソッドがありません。それをカバーするタグが必要です。 –

+0

ここにあなたの見積もりを見る。エディタの中に「スマート引用符」を使用すると、重大な問題が発生する可能性があります。それらを無効にするか、コーディングのためのエディタを使用してください。 – tadman

答えて

1

文字列、特に長い文字列に対して繰り返し置換を行う場合、置換方法をできるだけ効率的にすることが望ましいでしょう。とりわけ、リストが大きくなるにつれて、スイッチするための一連のものを回転させることは苦労して高価です。ここで

はあなたのアプローチのバリエーションです:

replacement = Regexp.new('\b%s\b' % [ Regexp.union(key_words) ]) 
replaced = text.gsub(replacement) do |s| 
    s.colorize(:red) 
end 

puts replaced 

あなたが繰り返しその置換を使用している場合は、定数にRegexpオブジェクトを永続化する必要があります。これにより、調整している各文字列のためにそれをコンパイルする必要がなくなります。予測が困難な要因に基づいてリストが変更された場合は、このようにして動的に生成します。

Rubyの使用に関する注意点の1つは、出力をの最終のステップとして、一連の変換としてコードを表現することが最も良いことです。ループの途中でprintのようなものを置くと、不必要に物事が複雑になります。あなたのループに追加のステップを追加したい場合は、それを後のステージに移動するために多くの余分な作業をしなければなりません。ここのアプローチでは、最後にチェーンを張って、あなたが何をしたいのかを行うことができます。

+0

Tadman、ありがとう、あなたの返事のために。私はそれを試してみましょう、あなたのアドバイスを消化し、あなたに戻って、それが私のために行った方法を教えてください。効率についての非常に興味深い説明。私はあなたがまだたくさんのことを学ぶことができるように、2週間しかコーディングしていません! – Andrew

関連する問題