簡體   English   中英

與數組中的子字符串匹配

[英]Match against substrings in array

我有一個數組:

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

和一個字符串:

my_str = "5012PR152"

我想看看字符串是否包含數組中的任何字符串。 如果數組中的字符串只是一個,那么它將起作用:

my_str.include?("PR")

但我不能將字符串數組作為要include?的參數include? 我該怎么辦?

您可以使用Enumerable方法any? 它占用一個塊,如果任何結果都不為false / nil,則返回true。

然后,您可以在my_arr塊中使用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)調用字符串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 
my_arr.inject(false) { |m, e| m ||= my_str.include? e }

這將返回正確的答案,但缺乏提早解決的功能。 我看不出實現這一目標的巧妙方法。

或者,對此進行猴子補丁String可能很有趣。

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

嘗試這個

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? 查找數組中是否有任何元素符合以下條件

在下面的塊中,我們希望將兩個元素都作為參數傳遞,並查看組合數組是否包括所述兩個元素的串聯。

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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM