替换字符串中的单词 - Ruby

Mit*_*ran 269 ruby ruby-on-rails-3

我在Ruby中有一个字符串:

sentence = "My name is Robert"
Run Code Online (Sandbox Code Playgroud)

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

src*_*der 475

sentence.sub! 'Robert', 'Joe'
Run Code Online (Sandbox Code Playgroud)

如果被替换的单词不在句子中([]=变体将会),则不会导致异常.

如何替换所有实例?

以上仅取代了"Robert"的第一个实例.

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

sentence.gsub! 'Robert', 'Joe'
Run Code Online (Sandbox Code Playgroud)

以上将取代罗伯特与乔的所有实例.

  • 在字符串文字上使用 `sub!` 和 `gsub!` 时要小心 - 应使用非感叹号版本。字符串文字在 Ruby 3 中是不可变的,这将引发异常。 (4认同)

Hna*_*att 123

如果您正在处理自然语言文本并且需要替换单词,而不仅仅是字符串的一部分,则必须向gsub添加一些正则表达式,因为纯文本替换会导致灾难性的结果:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"
Run Code Online (Sandbox Code Playgroud)

正则表达式具有单词边界,例如\b匹配单词的开头或结尾.从而,

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"
Run Code Online (Sandbox Code Playgroud)

在Ruby中,与Javascript等其他语言不同,单词边界与UTF-8兼容,因此您可以将它用于具有非拉丁语或扩展拉丁字母的语言:

'???? ? ??????, ??? ??????'.gsub(/\b????\b/, '?????')
=> "????? ? ??????, ??? ??????"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,某些语言甚至不使用空格,因此`\ b`不适用于它们,您需要在这些情况下使用形态分析器或类似的东西.此外,+1为搞笑的例子. (6认同)

Mit*_*ran 51

您可以尝试使用这种方式:

sentence ["Robert"] = "Roger"
Run Code Online (Sandbox Code Playgroud)

然后句子将成为:

sentence = "My name is Roger" # Robert is replaced with Roger
Run Code Online (Sandbox Code Playgroud)

  • 这很有趣,但绝对不应该被标记为正确的答案. (12认同)
  • 此方法的另一个问题是它只替换字符串的第一个实例. (9认同)
  • 如果原始字符串不包含您要替换的单词,是否会因此方法出错? (6认同)
  • 这很有意思.我以前从未见过这种替换方法. (3认同)
  • 只需确保减少`IndexError`.否则,一个单词不是句子的一部分会导致:`字符串不匹配(IndexError)` (2认同)

Sea*_*ill 44

首先,你没有在Ruby中声明类型,所以你不需要第一个string.

要替换字符串中的单词,请执行以下操作:sentence.gsub(/match/, "replacement").