J'ai une variable de chaîne avec un contenu comme suit:
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 ci-dessus, je dois trouver une sous-chaîne i.e.
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Comment puis-je le trouver? Je dois juste déterminer si la sous-chaîne est présente ou non.
Vous pouvez utiliser la méthode include?
:
_my_string = "abcdefg"
if my_string.include? "cde"
puts "String includes 'cde'"
end
_
Si la casse n'est pas pertinente, alors une expression régulière insensible à la casse est une bonne solution:
'aBcDe' =~ /bcd/i # evaluates as true
Cela fonctionnera également pour les chaînes multilignes.
Voir la classe Regexp de Ruby.
Vous pouvez aussi faire ça ...
my_string = "Hello world"
if my_string["Hello"]
puts 'It has "Hello"'
else
puts 'No "Hello" found'
end
# => 'It has "Hello"'
Développer la réponse de Clint Pachl:
La correspondance des expressions rationnelles dans Ruby renvoie nil lorsque l'expression ne correspond pas. Lorsque cela se produit, il renvoie l'index du personnage où la correspondance a lieu. Par exemple
"foobar" =~ /bar/ # returns 3
"foobar" =~ /foo/ # returns 0
"foobar" =~ /zzz/ # returns nil
Il est important de noter que dans Ruby, seuls nil et l'expression booléenne false sont évalués à false. Tout le reste, y compris un tableau vide, un hachage vide ou le nombre entier 0, est évalué à true.
C’est pourquoi le/foo/exemple ci-dessus fonctionne et pourquoi
if "string" =~ /regex/
fonctionne comme prévu. Entrez uniquement la partie "vraie" du bloc if si une correspondance est trouvée.
Un idiome plus succinct que la réponse acceptée ci-dessus qui est disponible dans Rails (à partir de 3.1.0 et plus) est .in?
.
Par exemple:
my_string = "abcdefg"
if "cde".in? my_string
puts "'cde' is in the String."
puts "i.e. String includes 'cde'"
end
Je pense aussi que c'est plus lisible.
c.f. http://apidock.com/Rails/v3.1.0/Object/in%3F
(Notez qu'il n'est disponible que dans Rails , et pas en pur Ruby.)
Manière ternaire
my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')
OR
puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')
Vous pouvez utiliser la méthode String Element Reference qui est []
À l'intérieur de []
peut être une sous-chaîne littérale, un index ou une regex:
> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil
Puisque nil
est fonctionnellement identique à false
et que toute sous-chaîne renvoyée par []
est true
, vous pouvez utiliser la logique comme si vous utilisiez la méthode .include?
:
0> if s[sub_s]
1> puts "\"#{s}\" has \"#{sub_s}\""
1> else
1* puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" has "abc"
0> if s[sub_s]
1> puts "\"#{s}\" has \"#{sub_s}\""
1> else
1* puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" does not have "xyz"
Assurez-vous simplement de ne pas confondre un index avec une sous-chaîne:
> '123456790'[8] # integer is eighth element, or '0'
=> "0" # would test as 'true' in Ruby
> '123456790'['8']
=> nil # correct
Vous pouvez également utiliser un regex:
> s[/A/i]
=> "a"
> s[/A/]
=> nil
user_input = gets.chomp
user_input.downcase!
if user_input.include?('substring')
# Do something
end
Cela vous aidera à vérifier si la chaîne contient une sous-chaîne ou non.
puts "Enter a string"
user_input = gets.chomp # Ex: Tommy
user_input.downcase! # tommy
if user_input.include?('s')
puts "Found"
else
puts "Not found"
end
Comment vérifier si une chaîne contient une sous-chaîne en Ruby?
Quand vous dites "check", je suppose que vous voulez un booléen retourné, auquel cas vous pouvez utiliser String#match?
. _match?
_ accepte les chaînes ou les expressions rationnelles en tant que premier paramètre. S'il s'agit de la première, elle est automatiquement convertie en une expression rationnelle. Donc, votre cas d'utilisation serait:
_str = 'string'
str.match? 'strings' #=> false
str.match? 'string' #=> true
str.match? 'strin' #=> true
str.match? 'trin' #=> true
str.match? 'tri' #=> true
_
_String#match?
_ présente l'avantage supplémentaire d'un second argument facultatif qui spécifie un index dans lequel rechercher la chaîne. Par défaut, il est défini sur _0
_.
_str.match? 'tri',0 #=> true
str.match? 'tri',1 #=> true
str.match? 'tri',2 #=> false
_