Ruby正则表达式同时选择多个单词
我有一个哈希,我正在使用regex来选择我想要的键/值对。以下是我写的方法: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
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合作,所以这是一个学习曲线问题,你第一次就非常接近!