Bir dizedeki kelimeleri değiştir - Ruby


281

Ruby'de bir dizem var:

sentence = "My name is Robert"

Karmaşık kod veya döngü kullanmadan bu cümledeki herhangi bir kelimeyi nasıl kolayca değiştirebilirim?


Ne şekilde değiştirilsin? Rasgele bir kelime (kelime # 2) veya belirli bir kelime ( my) değiştirilsin mi?
Blender

Kısa, basit ve kullanışlı sorunuz için teşekkürler. bence stil hashtag'lere bir çözüm bulmamda bana yardımcı oldu
Stef Hej

Yanıtlar:


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

Değiştirilen kelime cümle içinde değilse istisnaya neden olmaz ( []= varyant irade).

Tüm örnekler nasıl değiştirilir?

Yukarıdaki sadece "Robert" ın ilk örneğinin yerine geçer.

Tüm örnekleri değiştirmek için gsub/ gsub!(yani. "Global değiştirme") kullanın:

sentence.gsub! 'Robert', 'Joe'

Yukarıdakiler, Robert'ın tüm örneklerini Joe ile değiştirecek.


Bu sadece ilk durumun yerini alıyor gibi görünüyor, ki bu bazen iyi ve bazen de değil.
Jason Swett

@ JasonSwett cevabı tüm örneklerin nasıl değiştirileceğini kapsayacak şekilde güncelledi.
srcspider

128

Doğal dil metni ile uğraşıyorsanız ve sadece bir dizenin bir parçası değil, bir kelimeyi değiştirmeniz gerekiyorsa, düz metin ikamesi felaketle sonuçlanabileceğinden, gsub'ınıza bir tutam düzenli ifade eklemeniz gerekir:

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

Normal ifadeler, bir kelimenin \bbaşlangıcı veya sonu ile eşleşen kelime sınırlarına sahiptir. Böylece,

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

Ruby'de, Javascript gibi diğer dillerden farklı olarak, kelime sınırları UTF-8 ile uyumludur, bu yüzden Latince olmayan veya genişletilmiş Latin alfabesi olan diller için kullanabilirsiniz:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"

6
Bazı dillerin boşluk kullanmadıklarını, bu nedenle \bbu alanlarda çalışmadığını, bu durumlarda morfolojik analizörler veya bunun gibi şeyler kullanmanız gerektiğini unutmayın. Ayrıca, komik örnek için +1.
NiñoScript

57

Bu şekilde kullanmayı deneyebilirsiniz:

sentence ["Robert"] = "Roger"

Sonra cümle:

sentence = "My name is Roger" # Robert is replaced with Roger

4
Bu oldukça ilginç. Bu değiştirme yöntemini daha önce hiç görmedim.
Sean Hill

6
Orijinal dize değiştirmeye çalıştığınız kelimeyi içermiyorsa bu yöntemle ilgili bir hata almayacak mısınız?
srcspider

2
Sadece yeniden başlattığınızdan emin olun IndexError. Aksi takdirde cümlenin bir parçası olmayan bir kelime için:string not matched (IndexError)
Konrad Reiche

9
Bu yöntemle ilgili başka bir sorun, dizenin yalnızca ilk örneğinin yerini almasıdır.
Martin Konecny

14
Bu ilginç, ama kesinlikle doğru cevap olarak işaretlenmemelidir.
Niels Abildgaard

46

İlk olarak, Ruby'deki türü bildirmezsiniz, bu nedenle ilk string .

Dizede bir sözcük değiştirmek için tek yapmanız: sentence.gsub(/match/, "replacement").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.