簡體   English   中英

如何判斷我的字符串是否包含數組的子字符串?

[英]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.

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