![](/img/trans.png)
[英]how do I extract characters consecutive to the substring and the substring itself After checking if string array contains the required substring
[英]How can I tell if my string contains a substring from an array?
如何判斷我的字符串是否包含數組的子字符串?
我以為include?
是關鍵,但顯然不是...
arr = ["aa", "bb", "cc"]
str = "mystringcc"
str.include?(*arr)
ArgumentError: wrong number of arguments (given 3, expected 1)
在上面的示例中,我希望結果為true
因為字符串具有"cc"
,這是數組的元素。
您想使用Enumerable# any?
:
arr.any? { |substring| str.include?(substring) }
該解決方案非常有效,因為此方法可確保進行短路評估 ,也就是說,如果您有100000000個子字符串數組,並且要檢查字符串是否包含這些子字符串中的任何一個,則此方法將在其塊返回true
時立即停止,這意味着,如果匹配的子字符串在數組中位於第一個,則它將永遠不會檢查其他99999999元素。
構造一個正則表達式(不包括管道,斜線和點以及其他不可思議的東西):
arr = ["aa", "bb", "cc"]
str = "mystringcc"
reg = Regexp.union(arr) # That's all!
p str.match?(reg) #=> true
您收到該錯誤消息的原因是因為*
運算符告訴Ruby將arr
所有項目傳遞給str.include?
。 對於這些arr
項,相當於編寫str.include?("aa", "bb", "cc")
。
如其他答案中所述,檢查條件是否已針對數組中包含的任何元素進行了驗證,例如在您的情況下(您不想檢查數組的所有元素是否都是給定字符串的子字符串),使用arr.any? { |item| str.include?(item) }
完成arr.any? { |item| str.include?(item) }
arr.any? { |item| str.include?(item) }
arr.any? { |item| str.include?(item) }
。
鑒於:
arr = ["a", "b", "x"]
str = "DoDox"
編輯 :正如其他評論所指出的那樣,這實際上是最快的方法,因為當找到單個true語句時它將破壞評估:
arr.any?{|substr| str.include?(substr)}
的與foldl方式:我已經使用這個例子來說明折疊expresions的功率。 作為折疊的說明性示例,該解決方案可能有些優雅,但性能不足。
arr.map{|substr| str.include?(substr)}.inject{|x,y| x || y}
map
-function映射原始字符串str
可以具有的所有可能的子字符串。 使用邏輯或將inject
迭代返回的數組並比較其組成。 如果遇到數組“ arr”中的任何子字符串,則結果將在map結果中產生true。 如果map結果的任何值為true,則使用or-relation返回一個true值。 這比any?
慢any?
,因為即使遇到true
也會對數組中的每個值進行求值(wich總是在inject
末尾產生true
)。
["a", "b", "x"] -------> [false, false, true] ----------> true
map() inject()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.