如何判断我的字符串是否包含数组中的子字符串?

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 个子字符串的数组并且您想检查您的字符串是否包含任何在这些子字符串中,此方法将在其块 returns true 时立即停止,这意味着,如果匹配的子字符串在数组中位于第一个,它将永远不会检查其他 99999999 个元素。

给定:

arr = ["a", "b", "x"]
str = "DoDox"

编辑:正如其他评论所指出的,这实际上是最快的方法,因为它会在找到单个正确语句时中断评估:

arr.any?{|substr| str.include?(substr)}

foldl方式:我用这个例子来说明折叠表达式的威力。作为折叠的说明性示例,此解决方案可能有些优雅,但性能不够。

arr.map{|substr| str.include?(substr)}.inject{|x,y| x || y}

map 函数映射原始字符串 str 可能具有的所有可能的子字符串。 inject 遍历 returning 数组并使用逻辑或比较其组成部分。如果遇到数组 'arr' 中的任何子字符串,则结果将在 map 的结果中产生 true。使用 or 关系,我们 return 一个真值,如果 map 结果的任何值是真的。这比 any? 慢,因为数组中的每个值都会被计算,即使遇到 true(在 inject 的末尾总是会产生 true) .

["a", "b", "x"] -------> [false, false, true] ----------> true
                 map()                          inject()

构造一个正则表达式(没有竖线、斜杠、点和其他神奇的东西):

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) }.

完成