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
Essayez parens dans l'expression:
haystack.include?(needle1) || haystack.include?(needle2)
[needle1, needle2].any? { |needle| haystack.include? needle }
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.)
(haystack.split & [needle1, needle2]).any?
Pour utiliser la virgule comme séparateur: split(',')
Pour un tableau de sous-chaînes à rechercher, je recommanderais
needles = ["whatever", "pretty"]
if haystack.match(Regexp.union(needles))
...
end
Pour vérifier si contient au moins une des deux sous-chaînes:
haystack[/whatever|pretty/]
Retourne le premier résultat trouvé
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') }