Digamos que tengo una cadena str = "Things to do: eat and sleep."
¿Cómo puedo verificar si existe una palabra en una cadena y devolver falso si no aparece en ruby?
¿Cómo puedo comprobar si "do: "
existe en str, case insensitive?
Digamos que tengo una cadena str = "Things to do: eat and sleep."
¿Cómo puedo verificar si existe una palabra en una cadena y devolver falso si no aparece en ruby?
¿Cómo puedo comprobar si "do: "
existe en str, case insensitive?
De esta manera:
puts "yes" if str =~ /do:/i
para devolver un valor booleano (de un método, presumiblemente), comparar el resultado del partido de nil
:
def has_do(str)
(str =~ /do:/i) != nil
end
O, si no lo hace como el != nil
entonces se puede utilizar en lugar de !~
=~
y negar el resultado:
def has_do(str)
not str !~ /do:/i
end
Pero no me gusta mucho negaciones dobles ...
Usted podría también hacer esto:
str.downcase.include? "Some string".downcase
"Things to do: eat and sleep.".index(/do: /i)
índice devuelve la posición donde comienza el partido, o nil si no se encuentra
Puede obtener más información sobre el método de índice aquí: http://ruby-doc.org/core/classes/String.html
O sobre regex aquí: http://www.regular-expressions.info/ruby.html
Si todo lo que estoy buscando es un caso = subcadena coincidente insensibles que suelen utilizar:
str.downcase['do: ']
9 de cada 10 veces que no les importa dónde en la cadena del partido es, por lo esto es lindo y conciso.
Esto es lo que parece en el IRB:
>> str = "Things to do: eat and sleep." #=> "Things to do: eat and sleep."
>> str.downcase['do: '] #=> "do: "
>> str.downcase['foobar'] #=> nil
porque devuelve nil
si no hay un golpe funciona en los condicionales también.
En Ruby 1.9 se puede hacer así:
str.downcase.match("do: ") do
puts "yes"
end
No es exactamente lo que pidieron, pero noté un comentario a otra respuesta. Si no le importa usar expresiones regulares al hacer coincidir la cadena, tal vez haya una forma de omitir la parte de la parte inferior para obtener mayúsculas y minúsculas.
Para obtener más información, ver String#match
"tal vez hay una forma de saltear la parte de la carcasa para obtener insensibilidad de mayúsculas y minúsculas"? 'str.match (/ do:/i)' –
@theTinMan Ah, y fue incluso en la primera respuesta también. Necesita pensar mejor la próxima vez =) –
Si está ejecutando muchas expresiones regulares que no distinguen entre mayúsculas y minúsculas, * podría * ser más eficiente para archivar una vez y luego usar muchas expresiones regulares sensibles a mayúsculas y minúsculas. –
¿Sería posible hacer esto en un bloque if? P.ej. si str = ~/do:/i pone "sí" al final – oxo
@oxo Sí, por supuesto. De hecho, el primer código es meramente una abreviación de eso. –
También existe el viejo truco '!!' para obtener solo un resultado booleano: '>> !! (str = ~/do:/i) # => true' y' >> !! (str = ~/da :/i) # => falso'. –