Ersetzen Sie Wörter in einer Zeichenfolge - Ruby

281

Ich habe eine Zeichenfolge in Ruby:

sentence = "My name is Robert"

Wie kann ich ein Wort in diesem Satz einfach ersetzen, ohne komplexen Code oder eine Schleife zu verwenden?

Mithun Sasidharan
quelle
Auf welche Weise ersetzen? Ein beliebiges Wort (Wort 2) oder ein bestimmtes Wort ( my) ersetzen ?
Blender
Vielen Dank für Ihre kurze, einfache und nützliche Frage. Es hat mir geholfen, eine Lösung für das
Stef Hej,

Antworten:

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

Verursacht keine Ausnahme, wenn das ersetzte Wort nicht im Satz enthalten ist (die []=Variante wird es tun).

Wie ersetze ich alle Instanzen?

Das Obige ersetzt nur die erste Instanz von "Robert".

Um alle Instanzen zu ersetzen, verwenden Sie gsub/ gsub!(dh "globale Substitution"):

sentence.gsub! 'Robert', 'Joe'

Das Obige ersetzt alle Instanzen von Robert durch Joe.

srcspider
quelle
Dies scheint nur die erste Instanz zu ersetzen, was natürlich manchmal in Ordnung ist und manchmal nicht.
Jason Swett
@JasonSwett hat die Antwort aktualisiert, um zu beschreiben, wie alle Instanzen ersetzt werden.
srcspider
128

Wenn Sie sich mit Text in natürlicher Sprache beschäftigen und ein Wort ersetzen müssen, nicht nur einen Teil einer Zeichenfolge, müssen Sie Ihrem gsub eine Prise regulärer Ausdrücke hinzufügen, da eine einfache Textersetzung zu katastrophalen Ergebnissen führen kann:

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

Reguläre Ausdrücke haben Wortgrenzen, z. B. \bwelche Übereinstimmungen mit dem Anfang oder Ende eines Wortes übereinstimmen. So,

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

In Ruby sind Wortgrenzen im Gegensatz zu einigen anderen Sprachen wie Javascript UTF-8-kompatibel, sodass Sie sie für Sprachen mit nicht-lateinischen oder erweiterten lateinischen Alphabeten verwenden können:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
quelle
6
Beachten Sie, dass einige Sprachen nicht einmal Leerzeichen verwenden und daher \bnicht in ihnen funktionieren. In diesen Fällen müssten Sie morphologische Analysegeräte oder ähnliches verwenden. Auch +1 für lustiges Beispiel.
NiñoScript
57

Sie können Folgendes versuchen:

sentence ["Robert"] = "Roger"

Dann wird der Satz:

sentence = "My name is Roger" # Robert is replaced with Roger
Mithun Sasidharan
quelle
4
Das ist ziemlich interessant. Ich habe diese Ersatzmethode noch nie gesehen.
Sean Hill
6
Wird bei dieser Methode kein Fehler angezeigt, wenn die ursprüngliche Zeichenfolge nicht das Wort enthält, das Sie ersetzen möchten?
srcspider
2
Stellen Sie einfach sicher, dass Sie weitermachen IndexError. Andernfalls führt ein Wort, das nicht Teil des Satzes ist, zu:string not matched (IndexError)
Konrad Reiche
9
Ein weiteres Problem bei dieser Methode besteht darin, dass nur die erste Instanz der Zeichenfolge ersetzt wird.
Martin Konecny
14
Dies ist interessant, sollte aber definitiv nicht als die richtige Antwort markiert werden.
Niels Abildgaard
46

Erstens deklarieren Sie den Typ nicht in Ruby, sodass Sie den ersten nicht benötigen string.

Um ein Wort in einer Zeichenfolge zu ersetzen, gehen Sie wie folgt vor : sentence.gsub(/match/, "replacement").

Sean Hill
quelle