Замініть слова в рядку - Ruby


281

У мене є рядок у Ruby:

sentence = "My name is Robert"

Як я можу легко замінити будь-яке одне слово в цьому реченні без використання складного коду чи циклу?


Замінити яким способом? Замініть довільне слово (слово №2) або певне слово ( my)?
Блендер

Дякуємо за ваше коротке, просте та корисне запитання. це допомогло мені знайти рішення стилю хештегів на мій погляд
Стеф Хей,

Відповіді:


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

Не стане винятком, якщо замінене слово відсутнє у реченні ( []=варіант буде).

Як замінити всі екземпляри?

Сказане замінює лише першу інстанцію "Роберта".

Для заміни всіх екземплярів використовуйте gsub/ gsub!(тобто "глобальну заміну"):

sentence.gsub! 'Robert', 'Joe'

Сказане замінить усі екземпляри Роберта Джо.


Це, здається, замінює лише першу інстанцію, що, звичайно, іноді добре, а іноді ні.
Jason Swett

@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/, 'цукор')
=> "цукор у кисіль, для весіль"

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
Це цікаво, але його точно не слід позначати як правильну відповідь.
Niels Abildgaard

46

По-перше, ви не декларуєте тип у Ruby, так що вам не потрібен перший string.

Щоб замінити слово в рядку, ви робите: sentence.gsub(/match/, "replacement").

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.