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?


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.


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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.