ruby 如何使gsub方法只改变一次

zwghvu4y  于 2023-10-18  发布在  Ruby
关注(0)|答案(3)|浏览(119)

我没有词的标题,以及我不能rly解释它,但如果我有让说,我有这样的东西

puts ("red, blue").gsub("red", "blue").gsub("blue", "red")

我想让“红,蓝”变成“蓝,红”,它们是彼此的对立面,但是因为“红”变成了“蓝”,然后“蓝”又变成了“红”,它只是不起作用。
我尝试了另一种方法,我想让所有的例子中的“快乐”被替换为“悲伤”,反之亦然

qij5mzcb

qij5mzcb1#

您可以将替换作为散列提供。键要匹配模式(必须是字符串),值要替换:

>> "red, blue, blue, green".gsub(/red|blue/, {"red" => "blue", "blue" => "red"})
=> "blue, red, red, green"
>> "happy happy sad".gsub(/sad|happy/, {"sad" => "happy", "happy" => "sad"})
=> "sad sad happy"

对于更复杂的操作:

"happy happy sad red blue".gsub(/\w+/) do |m|
  case m
  when "happy" then "red"
  when "sad"   then "blue"
  when "red"   then "sad"
  when "blue"  then "happy"
  end
end
=> "red red blue sad happy"
  • https:rubyapi.org/3.3/o/string#class-String-label-Substitution+Methods*
wmvff8tz

wmvff8tz2#

你可以在一个块中使用Ruby的gsub()函数,例如。

puts 'red, blue'.gsub(/\b(?:red|blue)\b/) { |word| word == "red" ? "blue" : "red" }
=> "blue, red"

这里的想法是全局搜索redblue。然后将匹配传递给一个块(在其他编程语言中通常称为回调或lambda函数),该块将red交换为blue,反之亦然。

sg24os4d

sg24os4d3#

像这样使用临时占位符

str = "red, blue"
placeholder = "###TEMP_PLACEHOLDER###"

result = str.gsub("red", placeholder).gsub("blue", "red").gsub(placeholder, "blue")

puts result

相关问题