Ruby正则表达式同时选择多个单词

Ruby正则表达式同时选择多个单词,ruby,regex,Ruby,Regex,我有一个哈希,我正在使用regex来选择我想要的键/值对。以下是我写的方法: def extract_gender_race_totals(gender, race) totals = @data.select {|k,v| k.to_s.match(/(#{gender})(#{race})/)} temp = 0 totals.each {|key, value| temp += value} temp end 散列如下所示: @data = { :number_of_a

我有一个哈希,我正在使用regex来选择我想要的键/值对。以下是我写的方法:

def extract_gender_race_totals(gender, race)
  totals = @data.select {|k,v| k.to_s.match(/(#{gender})(#{race})/)}
  temp = 0
  totals.each {|key, value| temp += value}
  temp
end
散列如下所示:

 @data = {
:number_of_african_male_senior_managers=>2,
:number_of_coloured_male_senior_managers=>0,
:number_of_indian_male_senior_managers=>0,
:number_of_white_male_senior_managers=>0,
:number_of_african_female_senior_managers=>0,
:number_of_coloured_female_senior_managers=>0,
:number_of_indian_female_senior_managers=>0,
:number_of_white_female_senior_managers=>0,
:number_of_african_male_middle_managers=>2,
:number_of_coloured_male_middle_managers=>0,
:number_of_indian_male_middle_managers=>0,
:number_of_white_male_middle_managers=>0,
:number_of_african_female_middle_managers=>0,
:number_of_coloured_female_middle_managers=>0,
:number_of_indian_female_middle_managers=>0,
:number_of_white_female_middle_managers=>0,
:number_of_african_male_junior_managers=>0,
:number_of_coloured_male_junior_managers=>0,
:number_of_indian_male_junior_managers=>0,
:number_of_white_male_junior_managers=>0,
:number_of_african_female_junior_managers=>0,
:number_of_coloured_female_junior_managers=>0,
:number_of_indian_female_junior_managers=>0,
:number_of_white_female_junior_managers=>0
}
但在SQL查询之后,它会重新填充数据

我想这样做,关键必须包含种族和性别,以便它返回一些东西。否则它必须返回0。这是正确的还是正则表达式语法关闭了

它返回0表示所有,但它不应该返回

因此,我们可以举一个例子

   %td.total_cell= @ee_demographics_presenter.extract_gender_race_totals("male","african")

这将返回4位,有4位非洲男性经理。

试试这样的方法

def extract_gender_race_totals(gender, race)
  @data.select{|k, v| k.to_s.match(/#{race}_#{gender}/)}.values.reduce(:+)
end

extract_gender_race_totals("male", "african")
# => 4

试试这样的

def extract_gender_race_totals(gender, race)
  @data.select{|k, v| k.to_s.match(/#{race}_#{gender}/)}.values.reduce(:+)
end

extract_gender_race_totals("male", "african")
# => 4
答案给出了一个优雅的解决方案,但这里只是解释为什么您的regexp不太正确。如果您更正了regexp,我认为您的方法会起作用,它只是没有惯用的Ruby

/{性别}{种族}/与非洲男性高级经理的人数不匹配,原因有二:

1种族出现在哈希键中的性别之前,2哈希键中有一个下划线需要在regexp中。e、 g

/(#{race})_(#{gender})/
可以,但不需要括号,因此可以简化为

/#{race}_#{gender}/
答案给出了一个优雅的解决方案,但这里只是解释为什么您的regexp不太正确。如果您更正了regexp,我认为您的方法会起作用,它只是没有惯用的Ruby

/{性别}{种族}/与非洲男性高级经理的人数不匹配,原因有二:

1种族出现在哈希键中的性别之前,2哈希键中有一个下划线需要在regexp中。e、 g

/(#{race})_(#{gender})/
可以,但不需要括号,因此可以简化为

/#{race}_#{gender}/

您不必使用特定的方法来查询您的密钥片段,即性别\种族,您可以使用通用方法以任意顺序查询任何属性:

def extract_totals(*keywords)
  keywords.inject(@data) { |memo, keyword| memo.select { |k, v| k.to_s =~ /_#{keyword}(?:_|\b)/ } }.values.reduce(:+)
end
用法:

extract_totals("senior")
extract_totals("male", "african")
extract_totals("managers") # maybe you'll have _employees later...
# etc.

不完全是您要求的,但可能会有所帮助。

您可以使用常规方法以任意顺序查询任何属性,而不是使用特定方法来查询您的密钥片段,例如性别和种族:

def extract_totals(*keywords)
  keywords.inject(@data) { |memo, keyword| memo.select { |k, v| k.to_s =~ /_#{keyword}(?:_|\b)/ } }.values.reduce(:+)
end
用法:

extract_totals("senior")
extract_totals("male", "african")
extract_totals("managers") # maybe you'll have _employees later...
# etc.

不完全是您要求的,但可能会有帮助。

在此处键入输入和所需结果的示例。这是否有帮助?在尝试生成正则表达式时,我建议检查。在此处键入输入和所需结果的示例。这是否有帮助?在尝试生成正则表达式时,我建议你检查一下。谢谢你的帮助,我能看到你是从哪里来的!这是我第一次与regex合作,所以这是一个学习曲线问题,你第一次就非常接近!谢谢你的帮助,我知道你是从哪里来的!这是我第一次与regex合作,所以这是一个学习曲线问题,你第一次就非常接近!