Mam zmienną łańcuchową z zawartością:
varMessage =
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
"void::secondFunction(char const&)\n"
.
.
.
"this/is/last/line/liobrary.so"
W ciągu muszę znaleźć podciąg:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Jak mogę to znaleźć? Muszę ustalić, czy podciąg jest obecny, czy nie.
Odpowiedzi:
Możesz użyć
include?
metody:źródło
include?
to rozróżnianie wielkości liter. Więc jeślimy_string
w powyższym przykładzie byłoby coś w stylu"abcDefg"
(z dużymi literamiD
),include?("cde")
wróciłobyfalse
. Możesz zrobić todowncase()
przed połączenieminclude?()
.to_s
spowoduje ukrycie problemu i zwiększenie odległości między źródłem a wykryciem problemu, co utrudni debugowanie.Jeśli wielkość liter jest nieistotna, dobrym rozwiązaniem jest niewrażliwe na wielkość liter wyrażenie regularne :
Będzie to również działać w przypadku ciągów wieloliniowych.
Aby uzyskać więcej informacji, zobacz klasę Ruby's Regexp .
źródło
Regexp.escape
ciągu. W większości przypadkówsome_str.include? substr.downcase()
powinien działać szybciej i być bardziej czytelny.'aBcDe'.downcase.include?('bcd')
. Regex ma swój cel, ale nie używaj ich, gdy wbudowane metody są szybsze. Benchmarking z faktycznie testowanymi danymi może wiele pokazać./bcd/i.match?('aBcDe')
Możesz także to zrobić ...
W tym przykładzie użyto
#[]
metody String Ruby .źródło
#include?
wciąż jest trochę szybszy.#include?
nie działa, gdy pracujesz ze zdaniami ze spacjami wewnątrz, ponieważ#include
dzieli zdanie na słowa, a następnie używa słów jako osobnych wartości tablicowych. Działa to doskonale w przypadku zdań. +1[]
uzyskać więcej informacji, zobacz Metoda Ruby's String .Rozwijając odpowiedź Clinta Pachla:
Dopasowywanie
nil
wyrażeń regularnych w Ruby zwraca, gdy wyrażenie nie pasuje. Kiedy to zrobi, zwraca indeks znaku, w którym ma miejsce dopasowanie. Na przykład:Ważne jest, aby pamiętać, że tylko w języku Ruby
nil
wyrażenie boolowskie mafalse
wartość false. Wszystko inne, w tym pusta tablica, pusta wartość skrótu lub liczba całkowita 0, ma wartość true.Właśnie dlatego
/foo/
powyższy przykład działa i dlaczego.działa zgodnie z oczekiwaniami, wpisując „prawdziwą” część
if
bloku tylko w przypadku dopasowania.źródło
Bardziej zwięzły idiom niż zaakceptowana powyżej odpowiedź dostępna w Railsach (od 3.1.0 i wyżej) to
.in?
:Myślę też, że jest bardziej czytelny.
Więcej informacji znajduje się w
in?
dokumentacji.Zauważ jeszcze raz, że jest dostępny tylko w Railsach , a nie w czystym Ruby.
źródło
in?
."cde".in? my_string
w czystych plonach RubyNoMethodError
. Ale dziękirequire 'active_support/core_ext/object/inclusion'
temu działa, które mogą być ładowane albo z samego Railsa , albo z odciętych podstawowych rozszerzeń Active Support Core .Sposób trójskładnikowy
LUB
źródło
Możesz użyć metody String Element Reference , która jest
[]
Wewnątrz
[]
może znajdować się dosłowny podciąg, indeks lub wyrażenie regularne:Ponieważ
nil
funkcjonalnie jest taki sam, jakfalse
i każdy zwrócony podciąg[]
totrue
możesz użyć logiki tak, jakbyś używał metody.include?
:Tylko upewnij się, że nie pomylisz indeksu z łańcuchem podrzędnym:
Możesz także użyć wyrażenia regularnego:
źródło
Kiedy mówisz „sprawdź”, zakładam, że chcesz zwrócić wartość logiczną, w którym to przypadku możesz użyć
String#match?
.match?
akceptuje ciągi lub wyrażenia regularne jako swój pierwszy parametr, jeśli jest to pierwszy parametr, wówczas jest automatycznie konwertowany na wyrażenie regularne. Twój przypadek użycia to:String#match?
ma dodatkową zaletę opcjonalnego drugiego argumentu, który określa indeks, z którego należy przeszukiwać ciąg. Domyślnie jest to ustawione na0
.źródło
Pomoże to sprawdzić, czy ciąg zawiera podciąg, czy nie
źródło