Necesito sustituir el valor de una cadena en mi expresión regular en Ruby. ¿Hay una forma fácil de hacer esto? Por ejemplo:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Necesito sustituir el valor de una cadena en mi expresión regular en Ruby. ¿Hay una forma fácil de hacer esto? Por ejemplo:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Respuestas:
Igual que la inserción de cadena.
if goo =~ /#{Regexp.quote(foo)}/
#...
Tenga Regexp.quote
en cuenta que la respuesta de Jon L. es importante.
if goo =~ /#{Regexp.quote(foo)}/
Si solo haces la versión "obvia":
if goo =~ /#{foo}/
entonces los puntos en el texto de la coincidencia se tratan como comodines regexp y "0.0.0.0"
coincidirán "0a0b0c0"
.
Tenga en cuenta también que si realmente solo desea verificar una coincidencia de subcadena, simplemente puede hacer
if goo.include?(foo)
que no requiere una cita adicional o preocuparse por caracteres especiales.
.quote()
) también puede ser útil si está buscando construir una expresión regular usando una cadena.
if goo.include?(foo)
" => Verdadero cuando esté interesado en verificar la existencia. Si está interesado en reemplazar y ya está usando String.gsub, entonces Regexp.quote puede ser su única opción.
Regexp.new
o Regexp.compile
.
Regexp.compile(Regexp.escape(foo))
Utilice Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Aquí hay otra respuesta limitada pero útil:
Descubrí que puedo insertar fácilmente en una expresión regular sin usar Regexp.quote o Regexp.escape si solo uso comillas simples en mi cadena de entrada: (una coincidencia de dirección IP)
IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0")
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"
las comillas simples solo interpretan \\ y \ '.
http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes
Esto me ayudó cuando necesitaba usar la misma porción larga de una expresión regular varias veces. No es universal, pero se ajusta al ejemplo de la pregunta, creo.
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/