Tengo una variable de cadena con contenido:
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 tengo que encontrar una subcadena:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
¿Cómo puedo encontrarlo? Necesito determinar si la subcadena está presente o no.
Respuestas:
Puedes usar el
include?
método:fuente
include?
es sensible a mayúsculas y minúsculas. Entonces, simy_string
en el ejemplo anterior sería algo así"abcDefg"
(con mayúsculaD
),include?("cde")
volveríafalse
. Es posible que desee hacer unadowncase()
antes de llamarinclude?()
.to_s
ocultará el problema y aumentará la distancia entre la fuente y la detección del problema, lo que dificultará la depuración.Si el caso es irrelevante, entonces una expresión regular que no distingue entre mayúsculas y minúsculas es una buena solución:
Esto también funcionará para cadenas de varias líneas.
Vea la clase Regexp de Ruby para más información.
fuente
Regexp.escape
en la cadena. Para la mayoría de los casos de uso,some_str.include? substr.downcase()
debería funcionar más rápido y ser más legible.'aBcDe'.downcase.include?('bcd')
. Regex tiene su propósito, pero no los use cuando los métodos integrados son más rápidos. La evaluación comparativa con los datos reales que se están probando puede revelar mucho./bcd/i.match?('aBcDe')
También puedes hacer esto ...
Este ejemplo utiliza el
#[]
método de Ruby String .fuente
#include?
aún es un poco más rápido.#include?
no funciona cuando trabaja con oraciones con espacios en el interior porque#include
divide la oración en palabras y luego las usa como valores de matriz separados. Esto funciona perfectamente para las oraciones. +1[]
método String de Ruby para más información.Ampliando la respuesta de Clint Pachl:
La coincidencia de expresiones regulares en Ruby regresa
nil
cuando la expresión no coincide. Cuando lo hace, devuelve el índice del personaje donde ocurre la coincidencia. Por ejemplo:Es importante tener en cuenta que solo en Ruby
nil
y la expresión booleana sefalse
evalúa como falsa. 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
/foo/
ejemplo anterior funciona y por qué.funciona como se esperaba, solo ingresa la parte 'verdadera' del
if
bloque si se produce una coincidencia.fuente
Una expresión más sucinta que la respuesta aceptada anterior que está disponible en Rails (desde 3.1.0 y superior) es
.in?
:También creo que es más legible.
Consulte la
in?
documentación para más información.Tenga en cuenta nuevamente que solo está disponible en Rails , y no en Ruby puro.
fuente
in?
."cde".in? my_string
en puro Ruby cedeNoMethodError
. Pero conrequire 'active_support/core_ext/object/inclusion'
esto funciona, que puede cargarse desde Rails o desde las extensiones de Active Support Core recortadas .Camino ternario
O
fuente
Puede usar el método de referencia de elemento de cadena que es
[]
Dentro de
[]
puede ser una subcadena literal, un índice o una expresión regular:Dado que
nil
es funcionalmente el mismofalse
y cualquier subcadena devuelta[]
estrue
que puede usar la lógica como si usara el método.include?
:Solo asegúrese de no confundir un índice con una subcadena:
También puedes usar una expresión regular:
fuente
Cuando dices 'comprobar', supongo que quieres que se devuelva un booleano, en cuyo caso puedes usarlo
String#match?
.match?
acepta cadenas o expresiones regulares como su primer parámetro, si es el primero, se convierte automáticamente en una expresión regular. Entonces su caso de uso sería:String#match?
tiene el beneficio adicional de un segundo argumento opcional que especifica un índice desde el cual buscar la cadena. Por defecto, esto está configurado en0
.fuente
Esto lo ayudará a verificar si la cadena contiene una subcadena o no
fuente