Pregunta ¿Cómo comprobar si una cadena contiene una subcadena en Ruby?


Tengo una variable de cadena con contenido de la siguiente manera:

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"

en la secuencia anterior, tengo que encontrar una subcadena, es decir

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


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

¿Cómo puedo encontrarlo? Solo necesito determinar si la subcadena está presente o no.


583
2017-11-24 14:21


origen


Respuestas:


Puedes usar el include? método:

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

1100
2017-11-24 14:24



Si el caso es irrelevante, entonces un expresión regular insensible a mayúsculas y minúsculas es una buena solución:

'aBcDe' =~ /bcd/i  # evaluates as true

Esto también funcionará para cadenas de varias líneas.

Ver Ruby's Regexp clase.


72
2017-07-01 10:20



También puedes hacer esto ...

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



Ampliando la respuesta de Clint Pachl:

La coincidencia de expresiones regulares en Ruby regresa nulo cuando la expresión no coincide. Cuando lo hace, devuelve el índice del personaje donde ocurre la coincidencia. Por ejemplo

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

Es importante tener en cuenta que en Ruby only nil y la expresión boolean false se evalúan como false. Todo lo demás, incluido un conjunto vacío, hash vacío o el número entero 0, se evalúa como verdadero.

Es por eso que el / foo / ejemplo anterior funciona, y por qué

if "string" =~ /regex/

funciona como se esperaba Solo se ingresa la parte "verdadera" del bloque if si se produjo una coincidencia.


25
2017-07-09 18:58



Forma ternaria

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

O

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

14
2018-01-26 11:47



Una expresión más sucinta que la respuesta aceptada anterior que está disponible en Carriles (de 3.1.0 y superior) es .in?.

P.ej:

my_string = "abcdefg"
if "cde".in? my_string
  puts "'cde' is in the String."
  puts "i.e. String includes 'cde'"
end

También creo que es más legible.

c.f. http://apidock.com/rails/v3.1.0/Object/in%3F

(Tenga en cuenta que solo está disponible en Carriles, y no Ruby puro.)


13
2018-04-08 07:44



Puedes usar el Referencia de elemento de cadena método que es []

Dentro de [] puede ser una subcadena literal, un índice o una expresión regular:

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

Ya que nil es funcionalmente lo mismo que false y cualquier subcadena devuelta de [] es true puedes usar la lógica como si usas el método .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" 

Solo asegúrate de no confundir un índice con una cadena secundaria:

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct

También puedes usar una expresión regular:

> 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

Esto te ayudará a verificar si la cadena contiene una subcadena o no

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