2014-05-08 24 views
26

Uzun bir dize değişkeni var ve iki alt dizeden birini içerip içermediğini öğrenmek istiyorum.Bir dizenin birden çok alt dizeden birini içerip içermediğini kontrol edin

örn.

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

Şimdi olsa Ruby çalışmaz hangi Böyle bir disjunction gerekir:

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

cevap

31

ifadede parens deneyin:

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

kusursuz çalışır bulundu, teşekkür ederim. – Hedge

+0

Bunun olduğuna inanamıyorum. Teşekkür ederim. –

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

kullanmak için ayırıcı olarak virgül: split(',')

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

ayrıca .all ile çalışır? OR mantığı yerine AND mantık istediyseniz. Teşekkürler seph! – emery

+2

Bu, iğnelerin miktarı ile esnek olmanız gerekiyorsa daha iyi bir cevaptır. iğneler = [obj1, obj2, ..., objN]; needles.any? {| iğne | haystack.include? İğne} ' – daybreaker

4

Sen | kullanarak regex maç yapmak (veya) olabilir: Dizeleriniz bir dizide olup olmadığını

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

Veya:

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

Kodunuzun bir yazım hatası var," eşleşmesi "soru işareti olmamalıdır. – RobinSH

+0

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

+0

Yanlış eşleşme kullanıyorsunuz –

4

alt dizeleri dizisi için ben istiyorum aramak için önerileri

needles = ["whatever", "pretty"] 

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

Bir dizide birden çok alt dizeyi aramak için basit bir yol bulmaya çalışıyordum ve aşağıdaki yanıtları bulmaya çalışıyorum. o da soru. Ben cevabı pek çok geeks'in diğer cevapları kabul ettiğini ve kabul edileni değil, biliyorum diye ekledim.

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

ve kısmen aramansa: İki alt dizilerden en az birini içeriyorsa

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

kontrol etmek için:

haystack[/whatever|pretty/] 

İade ilk sonuç

İlgili konular