文字列の単語を置き換える-Ruby


281

Rubyに文字列があります。

sentence = "My name is Robert"

複雑なコードやループを使用せずに、この文の単語を簡単に置き換えるにはどうすればよいですか?


どのように交換しますか?任意の単語(単語#2)または特定の単語(my)を置き換えますか?
Blender

短くてシンプルで役立つ質問をありがとう。私の見解では、ハッシュタグをスタイルするソリューションを見つけるのに役立ちました
Stef Hej

回答:


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

置き換えられた単語が文にない場合でも例外は発生しません( []=バリアントはあります)。

すべてのインスタンスを置き換える方法は?

上記は、 "Robert"の最初のインスタンスのみを置き換えます。

すべてのインスタンスを置き換えるにはgsub/を使用しますgsub!(「グローバル置換」):

sentence.gsub! 'Robert', 'Joe'

上記はRobertのすべてのインスタンスをJoeに置き換えます。


これは最初のインスタンスのみを置き換えるようですが、もちろんそれは時々問題なく、時にはそうではありません。
Jason Swett 2013

@JasonSwettは、すべてのインスタンスを置き換える方法をカバーするように回答を更新しました。
srcspider 2013

128

自然言語のテキストを処理していて、文字列の一部ではなく単語を置き換える必要がある場合は、プレーンテキストの置換によって悲惨な結果が生じる可能性があるため、正規表現のピンチを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/, 'цукор')
=> "цукор у кисіль, для весіль"

6
一部の言語ではスペースも使用\bしないため、それらでは機能しないことに注意してください。このような場合は、形態素解析ツールなどを使用する必要があります。また、陽気な例では+1。
NiñoScript

57

あなたはこの方法を使用して試すことができます:

sentence ["Robert"] = "Roger"

その後、文は次のようになります。

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

4
面白いですね。この交換方法は今まで見たことがありません。
Sean Hill

6
元の文字列に置き換えようとしている単語が含まれていない場合、このメソッドでエラーが発生しませんか?
srcspider 2013年

2
だけで解決することを確認してくださいIndexError。:それ以外の場合は言葉ではない文の一部のためにつながるstring not matched (IndexError)
コンラッド・ライヒェ

9
このメソッドのもう1つの問題は、文字列の最初のインスタンスのみを置き換えることです。
Martin Konecny 2013

14
これは興味深いですが、正解としてマークされるべきではありません。
Niels Abildgaard 2014

46

まず、Rubyでは型を宣言しないため、最初のは必要ありませんstring

文字列内の単語を置き換えるには、次のようにしますsentence.gsub(/match/, "replacement")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.