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


J'ai une variable de chaîne avec le 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, c'est-à-dire

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"

Comment puis-je le trouver? J'ai juste besoin de déterminer si la sous-chaîne est présente ou non.


583
2017-11-24 14:21


origine


Réponses:


Vous pouvez utiliser le include? méthode:

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end

1100
2017-11-24 14:24



Si le cas n'est pas pertinent, alors un 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 Ruby's Regexp classe.


72
2017-07-01 10:20



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"'

33
2017-07-31 07:44



Expansion de la réponse de Clint Pachl:

Regex correspondant dans les retours Ruby néant lorsque l'expression ne correspond pas. Quand c'est le cas, il retourne l'index du caractère où la correspondance se produit. Par exemple

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil

Il est important de noter que dans Ruby seulement nil et l'expression booléenne false évalue à false. Tout le reste, y compris un tableau vide, un hachage vide ou l'entier 0, est évalué à true.

C'est pourquoi l'exemple / foo / ci-dessus fonctionne, et pourquoi

if "string" =~ /regex/

fonctionne comme prévu. Entrer seulement la partie 'vraie' du bloc if si une correspondance s'est produite.


25
2017-07-09 18:58



Manière ternaire

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')

OU

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')

14
2018-01-26 11:47



Un idiome plus succinct que la réponse acceptée ci-dessus qui est disponible dans Des rails (à partir de 3.1.0 et plus) .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 que ce n'est disponible que dans Des railset pas Rubis pur.)


13
2018-04-08 07:44



Vous pouvez utiliser le Référence d'élément de chaîne méthode qui est []

À l'intérieur de [] peut être une sous-chaîne littérale, un index ou une expression régulière:

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil

Depuis nil est fonctionnellement identique à false et 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 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 une regex:

> s[/A/i]
=> "a"
> s[/A/]
=> nil

5
2017-07-05 19:38



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

3
2018-04-01 05:49