[英]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]
!
將真實值(其他nil
和false
)轉換為false
,將虛假值( nil
或false
)轉換為true
。 因此, !!
將真實值轉換為true
,將虛假值轉換為false
。 您也可以將代碼塊寫為
{ |s| s =~ r ? true : false }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.