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

Hed*_*dge 38 ruby string ruby-on-rails ruby-2.1

我有一个很长的字符串变量,想知道它是否包含两个子串中的一个.

例如

haystack = 'this one is pretty long'
needle1 = 'whatever'
needle2 = 'pretty'
Run Code Online (Sandbox Code Playgroud)

现在我需要像这样的脱节,但在Ruby中不起作用:

if haystack.include? needle1 || haystack.include? needle2
    puts "needle found within haystack"
end
Run Code Online (Sandbox Code Playgroud)

sep*_*eph 74

[needle1, needle2].any? { |needle| haystack.include? needle }
Run Code Online (Sandbox Code Playgroud)

  • 也适用于.all?如果你想要AND逻辑而不是OR逻辑.谢谢,塞弗! (2认同)
  • 如果您需要灵活处理针头数量,这是更好的答案.`needle = [obj1,obj2,...,objN]; needles.any?{|针| haystack.include?针}` (2认同)

dan*_*anh 46

在表达式中尝试parens:

 haystack.include?(needle1) || haystack.include?(needle2)
Run Code Online (Sandbox Code Playgroud)


eml*_*lai 11

如果是Ruby 2.4,你可以使用|(或)进行正则表达式匹配:

if haystack.match? /whatever|pretty|something/
  …
end
Run Code Online (Sandbox Code Playgroud)

或者如果您的字符串在数组中:

if haystack.match? Regex.union(strings)
  …
end
Run Code Online (Sandbox Code Playgroud)

(对于Ruby <2.4,请使用.match无问号.)

  • @SephCordovano我如何使用它错误,我该如何纠正?对我而言,它看起来与上面链接的`match?`方法文档示例完全相同. (2认同)
  • 发表评论前请检查您的 Ruby 版本。2.4.0 有 `match?` 而以前的 Ruby 版本没有这个方法。在答案中添加了一个警告,以帮助解决此处提到的一些评论。 (2认同)

rgt*_*gtk 10

(haystack.split & [needle1, needle2]).any?
Run Code Online (Sandbox Code Playgroud)

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


Sep*_*ano 6

对于要搜索的子串的数组我推荐

needles = ["whatever", "pretty"]

if haystack.match(Regexp.union(needles))
  ...
end
Run Code Online (Sandbox Code Playgroud)


Kap*_*xey 5

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

haystack[/whatever|pretty/]
Run Code Online (Sandbox Code Playgroud)

返回找到的第一个结果