2014-05-08 11 views
26

Ich habe eine lange String-Variable und möchte herausfinden, ob sie einen von zwei Teilstrings enthält.Prüfe, ob ein String einen von mehreren Teilstrings enthält

z.B.

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

Jetzt würde ich eine Disjunktion wie diese braucht das nicht, obwohl in Ruby funktioniert:

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

Antwort

31

Versuchen Pars in dem Ausdruck:

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

funktioniert tadellos gefunden, danke. – Hedge

+0

Kann nicht glauben, dass es war. Vielen Dank. –

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

nutzen zu können, Komma als Trennzeichen: split(',')

55
[needle1, needle2].any? { |needle| haystack.include? needle } 
+2

funktioniert auch mit .all? wenn Sie UND-Logik anstelle von ODER-Logik wollten. Danke, Seph! – emery

+2

Dies ist die bessere Antwort, wenn Sie mit der Anzahl der Nadeln flexibel sein müssen. 'Nadeln = [obj1, obj2, ..., objN]; Nadeln. {| Nadel | haystack.include? nadel} ' – daybreaker

4

Sie können eine Regex tun | (oder):

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

Oder wenn Ihre Strings in einem Array sind:

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

Ihr Code hat einen Tippfehler, es sollte" Übereinstimmung "kein Fragezeichen sein. – RobinSH

+0

@RobinSH https://ruby-doc.org/core-2.4.0/String.html#method-i-match-3F – emlai

+0

Sie verwenden eine falsche Übereinstimmung –

4

Für eine Reihe von Teilstrings suchen Ich würde empfehle

0

Ich habe versucht, eine einfache Möglichkeit zu finden, mehrere Teilstrings in einem Array zu suchen und am Ende mit denen Antworten t er fragt auch. Ich habe die Antwort hinzugefügt, da ich weiß, dass viele Geeks andere Antworten betrachten und nicht nur die akzeptierten.

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

und teilweise, wenn die Suche:

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

Um zu überprüfen, ob mindestens eine von zwei Teil enthält:

haystack[/whatever|pretty/] 

Returns erstes Ergebnis