【问题标题】:Ruby - replace words in a string if instances do not matchRuby - 如果实例不匹配,则替换字符串中的单词
【发布时间】:2017-05-15 13:03:59
【问题描述】:

第一次在 Stackvoverflow 上,所以希望我正确且尽可能清晰地发布此内容。如果需要,请随时将其撕开,让我知道如何在未来发布更清晰的问题。

这里是 Ruby 的新手,并在我可以练习的地方进行练习。

我想知道如何在 ruby​​ 中替换字符串中的实例。

例如:

说我有:

string = 'richard julie richard julie sam letty sam letty'

如何替换字符串中不等于 'richard' 或 'julie' 的任何实例并再次替换为单词 richard?

所以在实现上述 ruby​​ 方法后新字符串会被读取:

string = 'richard julie richard julie richard richard richard richard

我尝试过像这样使用 gsub:

def string_replace(str)
  if str.include?("sam" || "letty")
    str.gsub! "sam" && "letty", "richard"
  end
end

我已经意识到这个尝试有很多问题;

  1. 使用布尔运算符时,只有一个参数会被计算!任何人都可以解释为什么吗?这也意味着当我需要将“sam”和“letty”都替换为“richard”时,只替换一个词。

  2. 这种尝试也非常有限,因为它只会替换那些出现的字符串 sam & letty 的实例。有没有更好的方法可以覆盖任何不等于richard 或 julie 的词,以再次替换为richard 一词?

非常感谢您对此提供的任何帮助。

谢谢你,新年快乐。

P.s 如何使用反勾号转义,以便打印灰色块来整理它?谢谢

【问题讨论】:

  • 对于 P. S. 问题,请检查我的编辑。
  • string.split.map { |w| w != "richard" && w != "julie" ? "richard" : w }.join(' ')
  • @sagarpandya82 很好的答案-谢谢,但在下面将 ReggieB 标记为更简洁且更易于理解的解决方案。再次感谢。

标签: ruby string replace str-replace


【解决方案1】:

另一个gsub,使用包含键“julie”的值“julie”和其他所有内容的“richard”的哈希:

string = 'richard julie richard julie sam letty sam letty'
h = Hash.new{"richard"}
h["julie"] = "julie"

p string.gsub(/\w+/, h) # =>"richard julie richard julie richard richard richard richard"

【讨论】:

  • 这是迄今为止最好的答案。
  • 嗨 Steenslag - 感谢您的回复 - 这个答案很棒并且可以作为解决方案,但我很难像下面的 ReggieB 解释那样清楚地理解它。感谢你的宝贵时间。不过还是给你点赞! :)
【解决方案2】:

这是gsub,我认为它可以满足您的需求:

string = 'richard julie richard julie sam letty sam letty'

string.gsub /\b(?!(richard|julie))\w+/, 'richard'

\ba word break?!(richard|julie)look ahead 不是 richard 也不是 julie。所以这基本上是一个单词中断和它后面的字母的匹配,这些字母不匹配 richard 也不匹配 julie

【讨论】:

  • 嗨@ReggieB - 我在所有其他回复中都接受了这个答案(因为它们都可以作为解决方案!),但你的答案是最好的解释和最容易理解的,尤其是因为我刚开始了解红宝石& 正则表达式-非常感谢!
【解决方案3】:

您在这里的部分困惑是您稍微误解了||&& 运算符的作用。

|| 不是一种通用方式,可以将任意方法(例如 include?)与 2 个可能的值一起使用。它是一个运算符,表示如果|| 的任一侧为真,则认为整体表达式为真。所以要说 字符串是否包含 sam 或 letty,您需要像这样完整地写出这两个条件:

if str.include?("sam") || str.include?("letty")

同样&& 是一个检查两个表达式是否为真的运算符,它不能与gsub! 一起使用以您尝试的方式替换两个不同的单词。

355E3b 使用map 的方法是替换匹配特定条件的单词的好方法,遵循拆分成单词列表、处理每个单词然后重新组合在一起的一般方法。


一开始您可能会感到困惑,但稍后会发现非常方便的是,计算其他值是真假,而不仅仅是文字 truefalse。这就是人们谈论truthyfalsey 时的意思。任何字符串都是真实的,所以:

"sam" || "letty" # => "sam"

“sam”是真的,所以Ruby不需要看第二个值就知道整体是真的,所以它有左边的值。

"sam" && "lenny" # => "lenny"

对于 and 条件,Ruby 需要首先检查左侧,如果是真的,那么检查右侧以确定整体是否真实。所以在这种情况下,整个表达式的值是从右边开始的。

【讨论】:

  • 嗨 mikej - 这是非常有用且详细的信息 - 非常感谢您的解释!帮助我澄清了一些事情!
【解决方案4】:

纯正则表达式解决方案:

input = 'richard julie richard julie sam letty sam letty'
left = %w|richard julie|
subst = 'richard'

input.gsub(/\w+/) { |m| left.include?(m) ? m : subst }
#⇒ "richard julie richard julie richard richard richard richard"

【讨论】:

  • 嗨 mudasobwa - 谢谢你 - 工作得很好。 & 也感谢您对我的编辑的帮助 - 我基本上不需要反勾号吗?请接受对此的帮助和有效的解决方案。 :)
【解决方案5】:

对于第 1 点,include? 不采用布尔表达式,而是采用真值。如果你传递一个布尔表达式,它将返回 turthy 值。

"sam" && "lenny" # => "lenny"
"sam" || "letty" # => "sam"

对于第 2 点,这将替换不是 richardjulie 的任何单词。

def string_replace(string)
  non_removed_words = ['richard', 'julie']
  words = string.split(' ')
  words.map { |w| non_removed_words.include?(w) ? w : 'richard' }.join(' ')
end

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2019-06-02
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多