我有一个数组:
my_arr = ["PR", "PM", "EM", "SM", "ST"]
和一个字符串:
my_str = "5012PR152"
我想看看字符串是否包含数组中的任何字符串。如果数组中的字符串只是一个,那么这将起作用:
my_str.include?("PR")
但是我无法将字符串数组作为参数传递给include?
。我怎么能这样做呢?
答案 0 :(得分:3)
您可以使用带有块的Enumerable方法any?
,如果任何结果是false / nil,则返回true。
然后,您可以使用块中的my_arr
数组来检查使用indlude?()
方法的字符串。
最终会看起来像这样:
my_arr.any? { |a| my_string.include?(a) }
或者,您可以创建一个方法,以便将来使用。这可能看起来像这样:
class String
def any_include?(array)
array.any? { |a| include?(a) }
end
end
您可以使用my_str.any_include?(my_arr)
2.1.2 :001 > class String
2.1.2 :002?> def any_include?(array)
2.1.2 :003?> array.any? { |a| include?(a) }
2.1.2 :004?> end
2.1.2 :005?> end
=> :any_include?
2.1.2 :006 > my_arr = ["PR", "PM", "EM", "SM", "ST"]
=> ["PR", "PM", "EM", "SM", "ST"]
2.1.2 :007 > my_str = "5012PR152"
=> "5012PR152"
2.1.2 :008 > my_str.any_include?(my_arr)
=> true
答案 1 :(得分:1)
my_arr.inject(false) { |m, e| m ||= my_str.include? e }
这会返回正确答案,但缺少提前退出;我没有看到一种简洁的方法来实现这一点。
或者,为此修补字符串可能很有趣......
class String
def anyinclude? a
a.each do |e|
if include? e
return true
end
end
return false
end
end
my_arr = ["PR", "PM", "EM", "SM", "ST"]
p "5012PR152".anyinclude? my_arr
答案 2 :(得分:0)
试试这个
def include_substring(str, arr)
str.chars.each_cons(2).to_a.any? { |a,b| arr.include?([a,b].join('')) }
end
include_substring('5012PR152', ['PR', QZ'])
=> true
击穿
chars
- 将字符串分解为每个字符的数组
each-cons(2)
- 将此数组分区为两个
any?
查找数组中的任何元素是否符合以下条件
在下面的块中,我们希望将两个元素作为参数传入,并查看组合数组是否包含所述两个元素的串联。
答案 3 :(得分:0)
my_arr = ["PR", "PM", "EM", "SM", "ST"]
r = Regexp.union(my_arr)
# => /PR|PM|EM|SM|ST/
["5012PR152", "5512ST011", "5012ME031"].map { |s| !!(s =~ r) }
#=> [true, true, false]
!
会将真实价值(任何其他nil
和false
)转换为false
和虚假价值(nil
或false
)到true
。因此,!!
会将真实值转换为true
,将虚假值转换为false
。您也可以将块写为
{ |s| s =~ r ? true : false }