【问题标题】:Replace words in a string - Ruby替换字符串中的单词 - Ruby
【发布时间】:2018-07-07 19:31:22
【问题描述】:

我在 Ruby 中有一个字符串:

sentence = "My name is Robert"

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

【问题讨论】:

  • 用什么方式替换?替换任意单词(单词#2)或特定单词(my)?
  • 感谢您提出简短、简单且有用的问题。它帮助我找到了在我看来为主题标签设置样式的解决方案

标签: ruby ruby-on-rails-3


【解决方案1】:
sentence.sub! 'Robert', 'Joe'

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

如何替换所有实例?

以上内容仅替换了“Robert”的第一个实例。

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

sentence.gsub! 'Robert', 'Joe'

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

【讨论】:

  • 这似乎只替换了第一个实例,当然有时可以,有时不行。
  • @JasonSwett 更新了答案以涵盖如何替换所有实例。
  • 在字符串文字上使用sub!gsub! 时要小心——应该使用非感叹号版本。字符串字面量在 Ruby 3 中将是不可变的,这将引发异常。
  • 如果您想用任何内容替换所有出现的内容(例如""),那么您也可以使用delete!( "Robert" )
  • 就像@ItayGrudev 提到的那样,请注意.sub! 会变异sentence。您可能只想改用.sub
【解决方案2】:

如果你正在处理自然语言文本并且需要替换一个单词,而不仅仅是字符串的一部分,你必须在你的 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/, 'цукор')
=> "цукор у кисіль, для весіль"

【讨论】:

  • 请注意,有些语言甚至不使用空格,因此\b 在它们中不起作用,在这些情况下您需要使用形态分析器或类似的东西。另外,+1 搞笑的例子。
【解决方案3】:

你可以试试这个方法:

sentence ["Robert"] = "Roger"

那么句子就会变成:

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

【讨论】:

  • 这很有趣。我以前从未见过这种替换方法。
  • 如果原始字符串不包含您要替换的单词,使用此方法会不会出错?
  • 请务必在IndexError 上恢复。否则对于一个不属于句子的单词会导致:string not matched (IndexError)
  • 这个方法的另一个问题是它只替换了字符串的第一个实例。
  • 这很有趣,但绝对不应该被标记为正确答案。
【解决方案4】:

首先,您没有在 Ruby 中声明类型,因此您不需要第一个 string

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

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多