regulares - Cree una expresión regular que no distinga mayúsculas y minúsculas a partir de una cadena en Ruby
ruby regex validator (4)
Las expresiones regulares de Ruby pueden interpolar expresiones de la misma manera que lo hacen las cadenas, usando la notación #{}
. Sin embargo, tienes que escapar de los caracteres especiales de expresiones regulares. Por ejemplo:
input_str = "A man + a plan * a canal : Panama!"
/#{Regexp.escape input_str}/i
Digamos que tengo una cadena arbitraria como
`A man + a plan * a canal : Panama!`
y quiero hacer una búsqueda de expresiones regulares para cadenas que son las mismas que no sean el caso. Es decir, esta expresión regular debe coincidir con la cadena
`a man + A PLAN * a canal : PaNaMa!`
Considero que el mejor enfoque es hacer una barra invertida para evitar que cada personaje tenga un significado especial en las expresiones regulares de Ruby, y luego haga Regexp.new
con esa cadena y Regexp::IGNORECASE
como argumentos. ¿Está bien? ¿Existe una expresión regular probada y verdadera para convertir cadenas arbitrarias en expresiones regulares literales ?
Por cierto, en última instancia, quiero usar esta expresión regular para hacer una consulta de MongoDB arbitraria que no distingue entre mayúsculas y minúsculas. Así que si hay otra forma en que podría hacerlo, por favor hágamelo saber.
Puede usar Regexp.escape
para escapar de todos los caracteres de la cadena que de lo contrario serían manejados especialmente por el motor de Regexp.escape
.
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE)
o
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i")
Si ya conoce la expresión regular que desea, puede agregar "i" después de la expresión (por ejemplo, /the center cannot hold it is too late/i
) para que no tenga mayúsculas .
Una forma ligeramente más sintáctica-azucarada de hacer esto es usar la notación %r
para los literales Regexp:
input_str = "A man + a plan * a canal : Panama!"
%r(#{Regexp.escape(input_str)})i
Por supuesto que se trata de preferencias personales.