web-dev-qa-db-fra.com

Vérifiez si une chaîne contient l'une des multiples sous-chaînes

J'ai une longue variable de chaîne et je veux savoir si elle contient l'une des deux sous-chaînes.

par exemple.

haystack = 'this one is pretty long'
needle1 = 'whatever'
needle2 = 'pretty'

Maintenant, j'aurais besoin d'une disjonction comme celle-ci qui ne fonctionne pas en Ruby cependant:

if haystack.include? needle1 || haystack.include? needle2
    puts "needle found within haystack"
end
37
Hedge

Essayez parens dans l'expression:

 haystack.include?(needle1) || haystack.include?(needle2)
45
lara
[needle1, needle2].any? { |needle| haystack.include? needle }
71
seph

Si Ruby 2.4, vous pouvez faire une correspondance d'expression régulière en utilisant | (ou):

if haystack.match? /whatever|pretty|something/
  …
end

Ou si vos chaînes sont dans un tableau:

if haystack.match? Regex.union(strings)
  …
end

(Pour Ruby <2.4, utilisez .match sans point d'interrogation.)

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

Pour utiliser la virgule comme séparateur: split(',')

10
rgtk

Pour un tableau de sous-chaînes à rechercher, je recommanderais

needles = ["whatever", "pretty"]

if haystack.match(Regexp.union(needles))
  ...
end
6
Seph Cordovano

Pour vérifier si contient au moins une des deux sous-chaînes:

haystack[/whatever|pretty/]

Retourne le premier résultat trouvé

3
Kapitula Alexey

J'essayais de trouver un moyen simple de rechercher plusieurs sous-chaînes dans un tableau et de me retrouver avec ci-dessous qui répond également à la question. J'ai ajouté la réponse car je sais que de nombreux geeks envisagent d'autres réponses et pas seulement la seule acceptée.

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

et si vous recherchez partiellement:

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