2012-09-12 21 views
95

En un modelo hay un campoEl Rubí% r} {expresión

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i 

Se ve bastante extraño para mí. Soy consciente de que esta es una expresión regular. Pero me gustaría:

  • para saber lo que significa exactamente. ¿Es %r{value} igual a /value/?
  • ser capaz de reemplazarlo con el operador regular de expresiones regulares Ruby /some regex/ o ~=. ¿Es posible?

Respuesta

203

%r{} es equivalente a la notación /.../, pero le permite tener '/' en su expresión regular sin tener que escapar de ellos:

%r{/home/user} 

es equivalente a:

/\/home\/user/ 

esto es sólo un producto de sintaxis, para la legibilidad.

Editar:

Tenga en cuenta que se puede utilizar casi cualquier par de carácter no alfabético en lugar de '{}'. Estas variantes funcionan igual de bien:

%r!/home/user! 
%r'/home/user' 
%r(/home/user) 
+15

Incluso 're =% r/home/user' funciona (con espacio como delimitador). – jdoe

+2

El downvote fue hace solo 1 hora. En cuanto al espacio como delimitador, esto es impresionante, pero no es el tipo de cosas que recomendaré para poder leer tu código sin desconcertarme seis meses después :) – Eureka

+1

Si usa espacios como delimitador, su expresión regular se romperá si agregarle espacios más tarde. Creo que la idea es usar delimitadores que no coincidan con nada en su expresión regular, con llaves como el valor predeterminado preferido. –

2

con esta expresión regular coincide con todas las cadenas que termina con .gif, .jpg ...

que podría reemplazarlo con

/\.(gif|jpg|jpeg|png)$/i 
+0

¿Tiene el nombre? – Alexandre

7

\. => contiene un punto
(gif|jpg|jpeg|png) => a continuación, , cualquiera de estas extensiones
$ => el final, nada después
i => case insensitive

Y es lo mismo que escribir /\.(gif|jpg|jpeg|png)$/i.

+0

¿Es% r {value} igual a/value /? – Alexandre

+0

Sí, es lo mismo. - Como '% w [1 2 3]' es lo mismo que '[1, 2, 3]' por ejemplo. –

+6

'% w [1 2 3]' es * no * lo mismo que '[1, 2, 3]'.Es lo mismo que '['1', '2', '3']'. –

0

Significa que image_file_name debe terminar ($) con dot y uno de gif, jpg, jpeg o png.

%r{} significan exactamente lo mismo que // pero en %r{} que no tienen que escapar /.

6

Con %r, se puede usar cualquier delimitadores.

Usted podría utilizar %r{} o %r[] o %r!! etc.

La ventaja de utilizar otros delimitadores es que no es necesario para escapar de la / usado en expresiones regulares normales literal.

+0

¿Qué hace% r [] o% r !! ¿media? – Alexandre

+2

Es lo mismo que '% r {}' – xdazz

Cuestiones relacionadas