J'ai une variable chaîne avec du contenu:
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"
Dans la chaîne, je dois trouver une sous-chaîne:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Comment le trouver? J'ai besoin de déterminer si la sous-chaîne est présente ou non.
Réponses:
Vous pouvez utiliser la
include?
méthode:la source
include?
c'est sensible à la casse. Donc, simy_string
dans l'exemple ci-dessus serait quelque chose comme"abcDefg"
(avec une majusculeD
),include?("cde")
reviendraitfalse
. Vous voudrez peut-être faire undowncase()
avant d'appelerinclude?()
.to_s
masquera le problème et augmentera la distance entre la source et la détection du problème, ce qui rendra le débogage plus difficile.Si la casse n'est pas pertinente, alors une expression régulière insensible à la casse est une bonne solution:
Cela fonctionnera également pour les chaînes multi-lignes.
Voir la classe Regexp de Ruby pour plus d'informations.
la source
Regexp.escape
sur la chaîne. Pour la plupart des cas d'utilisation,some_str.include? substr.downcase()
devrait fonctionner plus rapidement et être plus lisible.'aBcDe'.downcase.include?('bcd')
. Les regex ont leur raison d'être mais ne les utilisent pas lorsque les méthodes intégrées sont plus rapides. L'analyse comparative avec les données réelles testées peut en révéler beaucoup./bcd/i.match?('aBcDe')
Vous pouvez également le faire ...
Cet exemple utilise la
#[]
méthode String de Ruby .la source
#include?
c'est quand même un peu plus rapide.#include?
ne fonctionne pas lorsque vous travaillez avec des phrases avec des espaces à l'intérieur car#include
divise la phrase en mots, puis utilise les mots comme des valeurs de tableau distinctes. Cela fonctionne parfaitement pour les phrases. +1[]
méthode String de Ruby pour plus d'informations.Développant la réponse de Clint Pachl:
La correspondance d'
nil
expressions régulières dans Ruby revient lorsque l'expression ne correspond pas. Dans ce cas, il retourne l'index du caractère où la correspondance se produit. Par exemple:Il est important de noter que dans Ruby uniquement
nil
et que l'expression booléenne estfalse
fausse. Tout le reste, y compris un tableau vide, un hachage vide ou le nombre entier 0, est évalué comme vrai.C'est pourquoi l'
/foo/
exemple ci-dessus fonctionne et pourquoi.fonctionne comme prévu, n'entrant dans la partie «vraie» du
if
bloc que si une correspondance s'est produite.la source
Un idiome plus succinct que la réponse acceptée ci-dessus qui est disponible dans Rails (à partir de 3.1.0 et supérieur) est
.in?
:Je pense aussi que c'est plus lisible.
Consultez la
in?
documentation pour plus d'informations.Notez à nouveau qu'il n'est disponible que dans Rails , et non en Ruby pur.
la source
in?
."cde".in? my_string
en rendements Rubis pursNoMethodError
. Mais avecrequire 'active_support/core_ext/object/inclusion'
cela fonctionne, qui peut être chargé soit à partir de Rails lui-même, soit à partir des extensions de base Active Support Core .Voie ternaire
OU
la source
Vous pouvez utiliser la méthode String Element Reference qui est
[]
À l'intérieur du
[]
peut être une sous-chaîne littérale, un index ou une expression régulière:Puisque
nil
est fonctionnellement identique àfalse
et que toute sous-chaîne renvoyée l'[]
est,true
vous pouvez utiliser la logique comme si vous utilisiez la méthode.include?
:Assurez-vous simplement de ne pas confondre un index avec une sous-chaîne:
Vous pouvez également utiliser une expression régulière:
la source
Lorsque vous dites «vérifier», je suppose que vous souhaitez renvoyer un booléen, auquel cas vous pouvez l'utiliser
String#match?
.match?
accepte les chaînes ou les expressions régulières comme premier paramètre, si c'est le premier, il est automatiquement converti en expression régulière. Votre cas d'utilisation serait donc:String#match?
a l'avantage supplémentaire d'un deuxième argument facultatif qui spécifie un index à partir duquel rechercher la chaîne. Par défaut, il est défini sur0
.la source
Cela vous aidera à vérifier si la chaîne contient ou non une sous-chaîne
la source