替换字符串中的单词-Ruby


281

我在Ruby中有一个字符串:

sentence = "My name is Robert"

如何在不使用复杂代码或循环的情况下轻松替换此句子中的任何一个单词?


用什么方式更换?替换一个任意单词(第2个单词)还是一个特定的单词(my)?
Blender

多谢您简短,简单且实用的问题。在我看来,这帮助我找到了解决样式标签的方法的方法
Stef Hej,

Answers:


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

如果被替换的单词不在句子中,则不会引起异常([]=变体会)。

如何替换所有实例?

上面仅替换了“ Robert”的第一个实例。

要替换所有实例,请使用gsub/ gsub!(即“全局替换”):

sentence.gsub! 'Robert', 'Joe'

以上将用Joe替换Robert的所有实例。


这似乎只替换了初审,这当然有时很好,有时却没有。
杰森·斯威特

@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
那很有趣。我以前从未见过这种替换方法。
肖恩·希尔

6
如果原始字符串中不包含您要替换的单词,则使用此方法不会出错?
srcspider 2013年

2
只要确保恢复IndexError。否则,不包含该词的句子将导致:string not matched (IndexError)
Konrad Reiche

9
此方法的另一个问题是它仅替换字符串的第一个实例。
Martin Konecny13年

14
这很有趣,但绝对不应将其标记为正确答案。
Niels Abildgaard,2014年

46

首先,您无需在Ruby中声明类型,因此不需要first string

要在字符串替换一句话,你做的:sentence.gsub(/match/, "replacement")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.