functions - ¿Cómo comprobar si una cadena contiene una subcadena en Ruby?
ruby class string (9)
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 cadena anterior tengo que encontrar una cadena secundaria 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.
¿Cómo comprobar si una cadena contiene una subcadena en Ruby?
Cuando dices ''verificar'', asumo que quieres un booleano devuelto, ¿en qué caso puedes usar String#match?
. match?
acepta cadenas o expresiones regulares como su primer parámetro, si es el primero, entonces se convierte automáticamente en una expresión regular. Entonces tu caso de uso sería:
str = ''string''
str.match? ''strings'' #=> false
str.match? ''string'' #=> true
str.match? ''strin'' #=> true
str.match? ''trin'' #=> true
str.match? ''tri'' #=> true
String#match?
tiene el beneficio adicional de un segundo argumento opcional que especifica un índice desde el cual buscar la cadena. De forma predeterminada, esto se establece en 0
.
str.match? ''tri'',0 #=> true
str.match? ''tri'',1 #=> true
str.match? ''tri'',2 #=> false
Ampliando la respuesta de Clint Pachl:
La coincidencia de expresiones regulares en Ruby devuelve nulo cuando la expresión no coincide. Cuando lo hace, devuelve el índice del carácter 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 solo nil y la expresión booleana falso se evalúan como falso. Todo lo demás, incluida una matriz vacía, un hash vacío o el entero 0, se evalúa como verdadero.
Es por eso que el ejemplo / foo / anterior funciona, y por qué
if "string" =~ /regex/
Funciona como se espera. Solo se ingresa la parte ''verdadera'' del bloque if si ocurrió una coincidencia.
Camino ternario
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'')
Puede usar el método de referencia de elementos de cadena que es []
Dentro de []
puede haber una subcadena literal, un índice o una expresión regular:
> s=''abcdefg''
=> "abcdefg"
> s[''a'']
=> "a"
> s[''z'']
=> nil
Como nil
es funcionalmente lo mismo que false
y cualquier subcadena devuelta de []
es true
, puede usar la lógica como si usara 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úrese 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 puede utilizar una expresión regular:
> s[/A/i]
=> "a"
> s[/A/]
=> nil
Puede utilizar la include?
método:
my_string = "abcdefg"
if my_string.include? "cde"
puts "String includes ''cde''"
end
Si el caso es irrelevante, entonces una expresión regular que no distinga entre 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 clase Regexp de Ruby.
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"''
Un idioma más conciso que el de la respuesta aceptada que está disponible en Rails (desde 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.
cf http://apidock.com/rails/v3.1.0/Object/in%3F
(Tenga en cuenta que solo está disponible en Rails , y no en Ruby puro).
user_input = gets.chomp
user_input.downcase!
if user_input.include?(''substring'')
# Do something
end
Esto te ayudará a verificar si la cadena contiene subcadenas 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