2012-03-29 13 views
17

estoy usando la siguiente expresión regular para marchar hrefs en una página web.¿Es posible crear una expresión regular dinámica en Rubí

\/static\/workout\/[A-Z]{1,4}032812[A-Z]{1,5}-EQB.html 

Me gustaría encontrar una manera de hacer que la parte 032812 de la expresión regular dinámico, de tal manera que el valor reflejaría la fecha actual. Fore ejemplo, el 31 de marzo de 2012, la expresión regular se vería así:

\/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

intenté crear una cadena

a = \/static\/workout\/[A-Z]{1,4}033112[A-Z]{1,5}-EQB.html 

y luego

\ a \ 

pero esto no funcionó. Hay alguna forma de hacer esto.

Respuesta

52

Puede utilizar #{} al igual que en una cadena.

1.9.2p290 :001 > some_string = "033112" 
=> "033112" 
1.9.2p290 :002 > a_regex = /[A-Z]{1,4}#{some_string}[A-Z]{1-5}-EQB.html/ 
=> /[A-Z]{1,4}033112[A-Z]{1-5}-EQB.html/ 
+0

Gracias! Me estoy pateando a mí mismo por no pensar en eso. gracias de nuevo, agradezco tu ayuda. – Mutuelinvestor

+0

¿Funciona en ruby ​​2.2.0? – MC2DX

+1

@ MateuszCzerwiński Esto funciona en Ruby 2.2, pero se debe tener cuidado si la variable puede contener caracteres de expresiones regulares, considere el uso de '# {Regexp.quote (some_string)}' 'dentro /.../ '. – TWiStErRob

12

apoyo totalmente solución de Isaac, sino que también puedes:

a = "\/static\/workout\/[A-Z]{1,4}" + "033112" + "[A-Z]{1,5}-EQB.html" 
regex = Regexp.new(a) 
stringtomatch =~ regex 
+0

Entonces, sería algo como b = Regexp.new (a) y luego/b/para realizar la coincidencia. – Mutuelinvestor

+0

Voy a editar mi respuesta. También puede ayudarlo a poner la respuesta de Isaac en la luz correcta. –

+3

Para añadir a esto, es útil pensar en '/' en expresiones regulares la manera de pensar de '" 'para cuerdas:. Que le permite expresar una expresión regular literal de un texto Una vez que tenga que expresiones regulares, * la aplicación * se es un proceso separado que no le importa mucho si la expresión regular proviene de una forma literal o de alguna otra forma de generación de expresiones regulares. Por lo tanto, tomar una cadena y convertirla en una expresión regular y luego aplicarla no implica ninguna barra, como tomar una objeto, llamar 'to_s' en él y luego imprimir esa cadena no requiere ninguna comilla. Mi ejemplo anterior es simplemente un literal más elegante, por lo que es una ruta completamente diferente. –

Cuestiones relacionadas