2014-05-08 13 views
26

Mam długą zmienną ciągów i chcę dowiedzieć się, czy zawiera on jeden z dwóch podciągów.Sprawdź, czy ciąg zawiera jeden z wielu podłańcuchów.

np.

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

Teraz będę potrzebował alternatywę takiego, który nie działa w Ruby chociaż:

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

Odpowiedz

31

Spróbuj nawiasów w wyrażeniu:

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

działa bez zarzutu, dziękuję. – Hedge

+0

Nie mogę uwierzyć, że to było to. Dziękuję Ci. –

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

Aby korzystać przecinek jako separator: split(',')

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

również działa z .all? jeśli potrzebujesz logiki AND zamiast logiki OR. Dzięki, seph! – emery

+2

to jest lepsza odpowiedź, jeśli potrzebujesz być elastyczny z ilością igieł. 'igły = [obj1, obj2, ..., objN]; needles.any? {| igła | haystack.include? needle} ' – daybreaker

4

Można to zrobić przy użyciu | mecz regex (lub):

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

lub jeśli ciągi są w tablicy:

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

Twój kod ma literówkę, powinna być" mecz "bez znaku zapytania. – RobinSH

+0

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

+0

Używasz dopasowania niepoprawnego –

4

dla tablicy podciągów, aby szukać ja polecam

needles = ["whatever", "pretty"] 

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

Próbowałem znaleźć prosty sposób na przeszukiwanie wielu podłańcuchów w tablicy i kończy się na niżej, których odpowiedzi t on także pyta. Dodałem odpowiedź, ponieważ wiem, że wielu geeków rozważa inne odpowiedzi, a nie tylko akceptowane.

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

a jeśli szukają częściowo:

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

Aby sprawdzić, czy zawiera co najmniej jeden z dwóch podciągi:

haystack[/whatever|pretty/] 

Zwraca pierwszy wynik znaleziono

Powiązane problemy