У мене є рядок у Ruby:
sentence = "My name is Robert"
Як я можу легко замінити будь-яке одне слово в цьому реченні без використання складного коду чи циклу?
У мене є рядок у Ruby:
sentence = "My name is Robert"
Як я можу легко замінити будь-яке одне слово в цьому реченні без використання складного коду чи циклу?
Відповіді:
sentence.sub! 'Robert', 'Joe'
Не стане винятком, якщо замінене слово відсутнє у реченні ( []=
варіант буде).
Сказане замінює лише першу інстанцію "Роберта".
Для заміни всіх екземплярів використовуйте gsub
/ gsub!
(тобто "глобальну заміну"):
sentence.gsub! 'Robert', 'Joe'
Сказане замінить усі екземпляри Роберта Джо.
Якщо ви маєте справу з текстом на природній мові і вам потрібно замінити слово, а не лише частину рядка, вам потрібно додати дрібку регулярних виразів у свій 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/, 'цукор')
=> "цукор у кисіль, для весіль"
\b
вони не працюють в них, вам потрібно буде використовувати морфологічні аналізатори або подібні речі в тих випадках. Також +1 для веселого прикладу.
Ви можете спробувати скористатися цим способом:
sentence ["Robert"] = "Roger"
Тоді речення стане:
sentence = "My name is Roger" # Robert is replaced with Roger
IndexError
. Інакше слово, яке не є частиною речення, призведе до:string not matched (IndexError)
my
)?