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.