匹配数组中的子字符串

时间:2016-02-02 17:28:57

标签: arrays ruby string

我有一个数组:

my_arr = ["PR", "PM", "EM", "SM", "ST"]

和一个字符串:

my_str = "5012PR152"

我想看看字符串是否包含数组中的任何字符串。如果数组中的字符串只是一个,那么这将起作用:

my_str.include?("PR")

但是我无法将字符串数组作为参数传递给include?。我怎么能这样做呢?

4 个答案:

答案 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] 

!会将真实价值(任何其他nilfalse)转换为false和虚假价值(nilfalse)到true。因此,!!会将真实值转换为true,将虚假值转换为false。您也可以将块写为

{ |s| s =~ r ? true : false }