Eu tenho uma variável de seqüência de caracteres com o conteúdo:
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"
Na string, tenho que encontrar uma sub-string:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Como posso encontrá-lo? Preciso determinar se a sub-string está presente ou não.
Respostas:
Você pode usar o
include?
método:fonte
include?
é sensível a maiúsculas e minúsculas. Portanto, semy_string
no exemplo acima seria algo como"abcDefg"
(com maiúsculasD
),include?("cde")
retornariafalse
. Você pode fazer umadowncase()
antes de ligarinclude?()
.to_s
ocultará o problema e aumentará a distância entre a fonte e a detecção do problema, dificultando a depuração.Se o caso for irrelevante, uma expressão regular que não diferencia maiúsculas de minúsculas é uma boa solução:
Isso também funcionará para seqüências de várias linhas.
Veja a classe Regexp do Ruby para obter mais informações.
fonte
Regexp.escape
a string. Para a maioria dos casos de uso,some_str.include? substr.downcase()
deve funcionar mais rápido e ser mais legível.'aBcDe'.downcase.include?('bcd')
. O Regex tem seu objetivo, mas não o utiliza quando os métodos internos são mais rápidos. O benchmarking com os dados reais sendo testados pode revelar muito./bcd/i.match?('aBcDe')
Você também pode fazer isso ...
Este exemplo usa o
#[]
método String do Ruby .fonte
#include?
ainda é um pouco mais rápido.#include?
não funciona quando você está trabalhando com frases com espaços internos, porque#include
divide a frase em palavras e, em seguida, usa as palavras como valores de matriz separados. Isso funciona perfeitamente para frases. 1[]
método String do Ruby para obter mais informações.Expandindo a resposta de Clint Pachl:
A correspondência de
nil
expressões regulares em Ruby retorna quando a expressão não corresponde. Quando isso acontece, ele retorna o índice do personagem em que a correspondência acontece. Por exemplo:É importante observar que somente no Ruby
nil
e a expressão booleana éfalse
avaliada como falsa. Todo o resto, incluindo uma matriz vazia, hash vazio ou o número inteiro 0, é avaliado como verdadeiro.É por isso que o
/foo/
exemplo acima funciona e por quê.funciona como esperado, inserindo apenas a parte 'true' do
if
bloco se ocorrer uma correspondência.fonte
Um idioma mais sucinto do que a resposta aceita acima, disponível no Rails (a partir de 3.1.0 e superior) é
.in?
:Eu também acho que é mais legível.
Consulte a
in?
documentação para obter mais informações.Observe novamente que ele está disponível apenas no Rails , e não no Ruby puro.
fonte
in?
."cde".in? my_string
em rendimentos puros de RubyNoMethodError
. Mas comrequire 'active_support/core_ext/object/inclusion'
ele funciona, que pode ser carregado no próprio Rails ou nas extensões de núcleo de suporte ativo ativadas .Caminho ternário
OU
fonte
Você pode usar o método String Element Reference que é
[]
Dentro do
[]
pode haver uma substring literal, um índice ou uma expressão regular:Desde a
nil
funcionalmente é o mesmo quefalse
qualquer substring retornado,[]
étrue
possível usar a lógica como se você usasse o método.include?
:Apenas certifique-se de não confundir um índice com uma sub string:
Você também pode usar uma regex:
fonte
Quando você diz 'check', presumo que você queira um booleano retornado e, nesse caso, você poderá usar
String#match?
.match?
aceita strings ou regexes como seu primeiro parâmetro; se é o primeiro, é automaticamente convertido em um regex. Portanto, seu caso de uso seria:String#match?
tem o benefício adicional de um segundo argumento opcional que especifica um índice a partir do qual pesquisar a string. Por padrão, isso está definido como0
.fonte
Isso ajudará você a verificar se a string contém substring ou não
fonte