web-dev-qa-db-fra.com

Comment vérifier si une chaîne contient une sous-chaîne en Ruby?

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.

681
BSalunke

Vous pouvez utiliser la méthode include? :

_my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end
_
1267
Adam Lear

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.

81
Clint Pachl

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"'
40
Oto Brglez

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.

30
acib708

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.)

19
stwr667

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')
16
Mauro

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
9
dawg
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
2
Prabhakar

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
_
1
Sagar Pandya