2017-08-23 11 views
0

こんにちは私は文字列中の "u"または "you"のインスタンスを取って特定の単語に置き換える関数を作成しています。私は入ることができ、インスタンスを分離しても問題はありませんが、単語を適切に出力することはできません。これまでのところ私は持っています。文字列内の単語を置き換えて再結合する

def autocorrect(input) 

#replace = [['you','u'], ['your sister']] 
#replace.each{|replaced| input.gsub!(replaced[0], replaced[1])} 
input.split(" ") 

if (input == "u" && input.length == 1) || input == "you" 
    input.replace("your sister") 
end 

input.join(" ") 
end 

理想的な出力は次のようになります。

autocorrect("I am so smitten with you") 

"I am smitten with your sister" 

私は最後の部分が正しい取得する方法がわからない、私は、使用するよい方法を考えることはできません。どんな助けでも大歓迎です。

+1

'input ==" u "'は 'input.length'が1であることを意味します。後者のチェックは冗長です。 – Stefan

答えて

2

あなたのコードで抱えている問題は、あなたがinput.split(" ")を呼んでいますが、ないということですそれを保存してからinput == "u" # ...をチェックすると、autocorrect('u')またはautocorrect('you')を呼び出した場合、"your sister"が返されます。ex次の行のためにを呼び出してください:input.join(" ")はエラーを投げます。

このエラーは、inputがまだ元の文字列であり、各単語の配列ではなく、文字列にjoinメソッドがないことを忘れないでください。あなたのコードが可能最小限の変更で作業を取得するために

は、あなたがそれを変更することができますので、

def autocorrect(input) 
    #replace = [['you','u'], ['your sister']] 
    #replace.each{|replaced| input.gsub!(replaced[0], replaced[1])} 
    input.split(" ").map do |word| 
    if (word == "u" && word.length == 1) || word == "you" 
     "your sister" 
    else 
     word 
    end 
    end.join(" ") 
end 

、今、あなたあなたsplit(" ")入力した後、各単語で何かをやっている、とあなたはあります各単語を"u""you"と照合して、入力文字列全体ではなく、その後、置換する単語またはオリジナルのいずれかをマップし、それらを戻すために単一の文字列に戻します。代替案として


、短い方法、あなたは、置換を行うために2番目のパラメータとしてHashを取ることができたString#gsubを使用することができます。

2番目の引数がハッシュされ、マッチしたテキストがある場合そのキーの1つ、対応する値は置換文字列です。

def autocorrect(input) 
    replace = { 'you' => 'your sister', 
       'u' => 'your sister', 
       'another word' => 'something else entirely' } 

    input.gsub(/\b(#{replace.keys.join('|')})\b/, replace) 
end 

autocorrect("I am u so smitten with utopia you and another word") 
# => "I am your sister so smitten with utopia your sister and something else entirely" 

その例では正規表現が出てくるように見える:\bは、任意のワード境界であることを

/\b(you|u|another word)\b/ 

1

単純な配列のマッピングは、仕事をするだろう:

"I am u so smuitten with utopia you".split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ') 
#=> "I am your sister so smuitten with utopia your sister" 

あなたの方法は次のようになります。

def autocorrect(input) 
    input.split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ') 
end 

autocorrect("I am so smitten with you") 
#=> "I am smitten with your sister" 
+0

それは私のために働いていない。 –

関連する問題