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?


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.


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

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

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").

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.