Мне кажется, что это довольно простое решение:
DICTIONARY = {
"Hello" => "hi",
"to, two, too" => "2",
"for, four" => "4",
"be" => "b",
"you" => "u",
"at" => "@",
"and" => "&"
}.freeze
def word_substituter(tweet)
tweet.dup.tap do |t|
DICTIONARY.each { |key, replacement| t.gsub!(/\b(#{key.split(', ').join('|')})\b/, replacement) }
end
end
word_substituter("Hey guys, can anyone teach me how to be cool? I really want to be the best at everything, you know what I mean? Tweeting is super fun you guys!!!!")
# => "Hey guys, can anyone teach me how 2 b cool? I really want 2 b the best @ everything, u know what I mean? Tweeting is super fun u guys!!!!"
Разбить его на этапы:
- метод принимает твит и создает копию
- он передает это
tap
, поэтому он возвращается из вызова метода - , он перебирает
DICTIONARY
- , преобразует
key
врегулярное выражение (например, /\b(to|two|too)\b/
) - передает это в
gsub!
и заменяет любые совпадения на replacement
Если вы хотите заменить этоВхождение в слова (например, what => wh@
), вы можете удалить проверки границ слов (\b
) в регулярном выражении.
Одна ошибка заключается в том, что если любой из ключей вашего словаря содержит совпадения регулярных выражений, это потребуетНебольшая переделка: если бы у вас было "goodbye." => 'later xxx'
, точка соответствовала бы любому символу и включала бы его в заменяемое.Regexp.escape
ваш друг здесь.
Надеюсь, это поможет - дайте мне знать, как вы ладите.