Ganti kata dalam string - Ruby

282

Saya memiliki string di Ruby:

sentence = "My name is Robert"

Bagaimana saya bisa mengganti satu kata dalam kalimat ini dengan mudah tanpa menggunakan kode kompleks atau loop?

Mithun Sasidharan
sumber
Ganti dengan cara apa? Ganti kata yang berubah-ubah (kata # 2), atau kata tertentu ( my)?
Blender
Terima kasih atas pertanyaan singkat, sederhana dan bermanfaat Anda. itu membantu saya menemukan solusi untuk hashtag gaya dalam pandangan saya
Stef Hej

Jawaban:

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

Tidak akan menimbulkan pengecualian jika kata yang diganti tidak ada dalam kalimat ( []=varian akan).

Bagaimana cara mengganti semua instance?

Di atas hanya menggantikan contoh pertama dari "Robert".

Untuk mengganti semua instance gunakan gsub/ gsub!(mis. "Substitusi global"):

sentence.gsub! 'Robert', 'Joe'

Di atas akan menggantikan semua instance Robert dengan Joe.

srcspider
sumber
Ini tampaknya hanya menggantikan contoh pertama, yang tentu saja kadang baik dan kadang tidak.
Jason Swett
1
@JasonSwett memperbarui jawaban untuk mencakup cara mengganti semua instance.
srcspider
128

Jika Anda berurusan dengan teks bahasa alami dan perlu mengganti kata, bukan hanya bagian dari string, Anda harus menambahkan sejumput ekspresi reguler ke gsub Anda karena subtitusi teks biasa dapat menyebabkan hasil yang merusak:

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

Ekspresi reguler memiliki batas kata, seperti \byang cocok dengan awal atau akhir kata. Jadi,

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

Di Ruby, tidak seperti beberapa bahasa lain seperti Javascript, batas kata kompatibel dengan UTF-8, jadi Anda dapat menggunakannya untuk bahasa dengan huruf Latin non-Latin atau diperpanjang:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
sumber
6
Perhatikan bahwa beberapa bahasa bahkan tidak menggunakan spasi, jadi \btidak berfungsi di dalamnya, Anda perlu menggunakan analisis morfologis atau hal-hal seperti itu dalam kasus tersebut. Juga, +1 untuk contoh lucu.
NiñoScript
57

Anda dapat mencoba menggunakan cara ini:

sentence ["Robert"] = "Roger"

Maka kalimatnya akan menjadi:

sentence = "My name is Roger" # Robert is replaced with Roger
Mithun Sasidharan
sumber
4
Cukup menarik. Saya belum pernah melihat metode penggantian ini sebelumnya.
Sean Hill
6
Tidakkah Anda mendapatkan kesalahan dengan metode ini jika string asli tidak berisi kata yang Anda coba ganti?
srcspider
2
Pastikan untuk melanjutkan IndexError. Kalau tidak, kata yang bukan bagian dari kalimat akan mengarah ke:string not matched (IndexError)
Konrad Reiche
9
Masalah lain dengan metode ini adalah ia hanya menggantikan instance pertama dari string.
Martin Konecny
14
Ini menarik, tetapi seharusnya tidak ditandai sebagai jawaban yang benar.
Niels Abildgaard
46

Pertama, Anda tidak mendeklarasikan tipe dalam Ruby, jadi Anda tidak perlu yang pertama string.

Untuk mengganti kata dalam string, Anda lakukan: sentence.gsub(/match/, "replacement").

Sean Hill
sumber