Заменить слова в строке - Ruby

282

У меня есть строка в Ruby:

sentence = "My name is Robert"

Как я могу легко заменить одно слово в этом предложении, не используя сложный код или цикл?

Митхун Сасидхаран
источник
Заменить каким способом? Заменить произвольное слово (слово № 2) или конкретное слово ( my)?
Блендер
Спасибо за ваш короткий, простой и полезный вопрос. это помогло мне найти решение для стиля хэштегов на мой взгляд
Stef Hej

Ответы:

496
sentence.sub! 'Robert', 'Joe'

Не вызовет исключения, если замененное слово отсутствует в предложении ( []=вариант будет).

Как заменить все экземпляры?

Вышесказанное заменяет только первый экземпляр «Роберта».

Для замены всех экземпляров используйте gsub/ gsub!(т. Е. «Глобальное замещение»):

sentence.gsub! 'Robert', 'Joe'

Все вышеперечисленное заменит Роберта на Джо.

srcspider
источник
Кажется, это заменяет только первый случай, что, конечно, иногда хорошо, а иногда нет.
Джейсон Светт
1
@JasonSwett обновил ответ, чтобы рассказать, как заменить все экземпляры.
srcspider
128

Если вы имеете дело с текстом на естественном языке и вам нужно заменить слово, а не только часть строки, вам нужно добавить в ваш gsub щепотку регулярных выражений, поскольку подстановка простого текста может привести к катастрофическим результатам:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"

Регулярные выражения имеют границы слов, например, \bкоторые соответствуют началу или концу слова. Таким образом,

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"

В Ruby, в отличие от некоторых других языков, таких как Javascript, границы слов совместимы с UTF-8, поэтому вы можете использовать его для языков с нелатинскими или расширенными латинскими алфавитами:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
источник
6
Обратите внимание, что некоторые языки даже не используют пробелы, поэтому \bв них не работает, вам придется использовать морфологические анализаторы или тому подобное в этих случаях. Также +1 за веселый пример.
NiñoScript
57

Вы можете попробовать использовать этот способ:

sentence ["Robert"] = "Roger"

Тогда предложение станет:

sentence = "My name is Roger" # Robert is replaced with Roger
Митхун Сасидхаран
источник
4
Это довольно интересно. Я никогда не видел этот метод замены раньше.
Шон Хилл
6
Разве вы не получите ошибку с этим методом, если исходная строка не содержит слово, которое вы пытаетесь заменить?
srcspider
2
Просто не забудьте возобновить IndexError. В противном случае слово, не являющееся частью предложения, приведет к:string not matched (IndexError)
Конраду Рейше
9
Другая проблема этого метода заключается в том, что он заменяет только первый экземпляр строки.
Мартин Конечни
14
Это интересно, но определенно не следует помечать как правильный ответ.
Нильс Абильдгаард
46

Во-первых, вы не объявляете тип в Ruby, поэтому вам не нужно первое string.

Чтобы заменить слово в строке, вы делаете: sentence.gsub(/match/, "replacement").

Шон Хилл
источник