ruby - regulares - Interpolando una cadena en una expresión regular
ruby regex validator (7)
Aquí hay una respuesta limitada pero útil:
Descubrí que puedo insertar fácilmente en una expresión regular sin usar Regexp.quote o Regexp.escape si utilizo 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 necesité 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.
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
Igual que la inserción de cadena.
if goo =~ /#{Regexp.quote(foo)}/
#...
Probablemente, Regexp.escape(foo)
sea un punto de partida, pero ¿hay una buena razón por la que no puede usar la expresión-interpolación más convencional: "my stuff #{mysubstitutionvariable}"
?
Además, puedes usar !goo.match(foo).nil?
con una cadena literal.
Tenga en cuenta que el Regexp.quote
en la respuesta de Jon L. es importante.
if goo =~ /#{Regexp.quote(foo)}/
Si solo haces la versión "obvia":
if goo =~ /#{foo}/
a continuación, los períodos en el texto del partido se tratan como comodines de "0a0b0c0"
, y "0.0.0.0"
coincidirá con "0a0b0c0"
.
Tenga en cuenta también que si realmente desea comprobar si hay una coincidencia de subcadena, simplemente puede hacer
if goo.include?(foo)
que no requiere un presupuesto adicional o preocuparse por caracteres especiales.
Use Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Regexp.compile(Regexp.escape(foo))
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/