检查字符串是否包含多个子字符串中的一个

59
我有一个较长的字符串变量,想要确定它是否包含两个子字符串中的任意一个。
例如:
haystack = 'this one is pretty long'
needle1 = 'whatever'
needle2 = 'pretty'

现在我需要这样的一个析取式,尽管在Ruby中不起作用:

if haystack.include? needle1 || haystack.include? needle2
    puts "needle found within haystack"
end
8个回答

105
[needle1, needle2].any? { |needle| haystack.include? needle }

2
也适用于.all吗?如果你想要AND逻辑而不是OR逻辑。谢谢,seph! - emery
3
如果你需要灵活处理针头数量,这是更好的答案。needles = [obj1, obj2, ..., objN]; needles.any? { |needle| haystack.include? needle } - daybreaker

66

尝试在表达式中使用括号:

 haystack.include?(needle1) || haystack.include?(needle2)

不敢相信那就是它。谢谢。 - Wassim Dhif

24

您可以进行正则表达式匹配:

haystack.match? /needle1|needle2/

如果你的针是在一个数组中:

haystack.match? Regexp.union(needles)

(对于 Ruby < 2.4,使用不带问号的 .match。)


你的代码中有一个错别字,应该是match而不是问号。 - RobinSH
2
@SephCordovano,我是如何使用它错误的,我该如何纠正呢?对我来说,它看起来与上面链接的match?方法文档示例完全相同。 - emlai
@SephCordovano,你的评论有点令人困惑。你应该要么扩展它,要么删除它。 - Redoman
@jj_这有什么困惑的?如果你想搜索一个子字符串数组,你可以使用一个联合。 - Seph Cordovano
2
请在发表评论之前检查您的Ruby版本。2.4.0具有match?方法,而以前的Ruby版本没有此方法。添加了一个警告来帮助解决这里提到的一些评论。 - Sgnl
这是一个很棒的答案。清晰且可扩展。 - Joshua Pinter

10
(haystack.split & [needle1, needle2]).any?

使用逗号作为分隔符:split(',')


9

如果要搜索一组子字符串,我建议使用

needles = ["whatever", "pretty"]

if haystack.match?(Regexp.union(needles))
  ...
end

5

检查是否包含至少两个子字符串中的一个:

haystack[/whatever|pretty/]

返回找到的第一个结果。

0

我试图找到一种简单的方法来在数组中搜索多个子字符串,并最终得到了下面的答案,这也回答了问题。我添加了答案,因为我知道许多极客们考虑的是其他答案,而不仅仅是被接受的答案。

haystack.select { |str| str.include?(needle1) || str.include?(needle2) }

如果部分搜索:

haystack.select { |str| str.include?('wat') || str.include?('pre') }

0

使用or代替||

if haystack.include? needle1 or haystack.include? needle2
or 的优先级比 || 低,或者说它的“黏性”较弱 :-)

通常情况下,使用“or”代替“||”被认为是一个不好的主意,无论它在特定情况下是否实际可行。更多信息: https://github.com/rubocop/ruby-style-guide#andor-和 https://graceful.dev/courses/the-freebies/modules/ruby-language/topic/episode-125-and-or/ - Not Entered

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接