Ruby 如果字符串包含数组中包含的一个或多个值,则替换该字符串

Ruby 如果字符串包含数组中包含的一个或多个值,则替换该字符串,ruby,string,substitution,Ruby,String,Substitution,我有一个红宝石字符串,例如:蓝绿黄狗猫老鼠alpha-beta 我想替换: 用单词color表示颜色名称, 带有“动物”一词的动物名称,以及 带字母的希腊字母名称。 换句话说,在上面的示例中,我希望新字符串为: "color animal letter" 而不是 "color color color animal animal animal letter letter" 我想出了以下方法: def convert_string(string) if ["cat", "dog", "m

我有一个红宝石字符串,例如:蓝绿黄狗猫老鼠alpha-beta

我想替换:

用单词color表示颜色名称, 带有“动物”一词的动物名称,以及 带字母的希腊字母名称。 换句话说,在上面的示例中,我希望新字符串为:

"color animal letter"
而不是

"color color color animal animal animal letter letter"
我想出了以下方法:

def convert_string(string)
    if ["cat", "dog", "mouse"].include? key.to_s
      return "animal"
    end
    if ["blue", "yellow", "green"].include? key.to_s
      return "color"
    end
    if ["alpha", "beta"].include? key.to_s
      return "letter"
    end
    return key
end
如何改进我的方法以实现我的需求?

您可以使用gsub:

您可以使用gsub:

假设:

str = "gamma blue green yellow dog cat mouse alpha beta"
请注意,str与问题中给出的示例略有不同

我假设您希望用单词color或animals或字母替换字符串中的每一行颜色、动物或字母

这里有两种方法

一,

这使用和。后者在v.2.2中介绍。对于早期版本,请编写…chunk{s}

地图返回:

然后将其分块。将此数组表示为arr,分块的另一种替代方法是:

arr.each_with_object([]) { |w,a| a << w if a.empty? || w != a.last }

假设:

str = "gamma blue green yellow dog cat mouse alpha beta"
请注意,str与问题中给出的示例略有不同

我假设您希望用单词color或animals或字母替换字符串中的每一行颜色、动物或字母

这里有两种方法

一,

这使用和。后者在v.2.2中介绍。对于早期版本,请编写…chunk{s}

地图返回:

然后将其分块。将此数组表示为arr,分块的另一种替代方法是:

arr.each_with_object([]) { |w,a| a << w if a.empty? || w != a.last }


谢谢,它工作得很好。请随意提出这个解决方案作为答案,我会欣然接受。如果str=alpha-blue beta,期望的结果是什么?也就是说,你想用一只动物来代替一组动物吗?字符串是否可以包含非动物、颜色或字母的单词,例如甜甜圈?您的问题不清楚。为什么每个替换的单词只出现一次?一种类型的所有实例都替换为一个单词?如果是,在哪个位置?也就是说,蓝猫绿应该变成动物的颜色还是动物的颜色,还是无关紧要?或者,您是否只将一种连续的名称替换为一个单词,将动物颜色替换为蓝猫绿?谢谢,它工作得非常好。请随意提出这个解决方案作为答案,我会欣然接受。如果str=alpha-blue beta,期望的结果是什么?也就是说,你想用一只动物来代替一组动物吗?字符串是否可以包含非动物、颜色或字母的单词,例如甜甜圈?您的问题不清楚。为什么每个替换的单词只出现一次?一种类型的所有实例都替换为一个单词?如果是,在哪个位置?也就是说,蓝猫绿应该变成动物的颜色还是动物的颜色,还是无关紧要?或者,您是否只将一个种类的连续名称替换为一个单词,将动物颜色替换为蓝猫绿?如果str=alpha-blue-beta,则返回字母颜色。我认为需要字母颜色的字母,但需要澄清。感谢您的评论@CarySwoveland。在您的示例中,我们需要的是字母颜色,而不是字母颜色,这就是我接受@potashin.If str=alpha blue beta的anwser的原因。如果str=alpha blue beta,则返回字母颜色。我认为需要字母颜色的字母,但需要澄清。感谢您的评论@CarySwoveland。在你的例子中,我们想要的是字母颜色,而不是字母颜色,这就是为什么我接受了@potashin的anwser。谢谢你的回答。请参阅我对@potashin回答的评论以获得澄清。谢谢您的回答。请参阅我对@potashin回复的评论以获得澄清。
arr.each_with_object([]) { |w,a| a << w if a.empty? || w != a.last }
COLOR  = "color"
ANIMAL = "animal"
LETTER = "letter"

h = { COLOR  => %w{ blue green yellow },      
      ANIMAL => %w{ dog cat mouse },
      LETTER => %w{ alpha beta gamma } }.
      each_with_object({}) { |(k,v), h| v.each { |item| h[item] = k } }
 #=> {"blue"=>"color", "green"=>"color", "yellow"=>"color",
 #    "dog"=>"animal", "cat"=>"animal", "mouse"=>"animal",
 #    "alpha"=>"letter", "beta"=>"letter", "gamma"=>"letter"}

r = /
    \b        # match a word break
    (\w+)     # match a word in capture group 1
    (?:\s\1)+ # match one or more copies of the matched word, each preceded by a space
    \b        # match a word break
    /x        # extended or free-spacing mode

str.gsub(/\w+/,h).gsub(r,'\1')
  #=> "letter color animal letter"
str.split.map { |word| h[word] }.chunk(&:itself).map(&:first).join(' ')
  #=> "letter color animal letter"