如何在返回值中使用条件的var string
?
lines = ["dyfögifuödxfghif", "xdghödfx", "abcdefg"]
strings = ["abc", "zzzzzzzzz"]
lines.each do |line|
if strings.any? { |string| line.include?(string) }
return string
end
end
return nil
数据类型:
lines:Array, line:String, strings:Array, string:String
期望的结果:
=> "abc"
我正在迭代很多行,如果它们在名为strings
- >的数组中包含一个字符串,则想要检查它们中的每一行。直到我找到匹配或完成迭代。
此代码段 有效,但它执行相同的操作两次:
lines.each do |line|
if strings.any? { |string| line.include?(string) }
return strings.detect { |string| line.include?(string) }
end
end
return nil
答案 0 :(得分:2)
您可以使用detect
:
return strings.detect { |string| lines.any? { |line| line.include?(string) } }
答案 1 :(得分:2)
你可以使用.find和一些正则表达式来恢复第一场比赛
strings.find {|word| lines.find {|line| line =~ /#{word}/ } }
=> "abc"
# if you want all matches
strings.select {|word| lines.find {|line| line =~ /#{word}/ } }
=> ["abc"]
答案 2 :(得分:1)
如果你想要第一场比赛:
strings.detect { |string| line.include?(string) }
如果你想要所有匹配(在一个数组中):
strings.select { |string| line.include?(string) }
答案 3 :(得分:0)
如果编译要匹配的紧凑正则表达式的字符串列表,则可以非常轻松地执行此操作:
string_rx = Regexp.union(strings)
然后你所要做的就是过滤掉匹配的行并拉出第一行:
lines.grep(string_rx).first
# => "abcdefg"
如果您不想处理整个阵列并对其进行优化以提高性能:
lines.lazy.grep(string_rx).first
# => "abcdefg"
lazy
指示符使每个条目流经链完成,而不是每个阶段缓冲,然后传递到下一个。