L’expression Ruby% r {}

Dans un modèle, il y a un champ

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

Ça a l’air bizarre pour moi. Je suis conscient que c’est une expression régulière. Mais je voudrais:

  • pour savoir ce que cela signifie exactement. Est-ce que %r{value} égal à /value/ ?
  • pouvoir le remplacer par un opérateur normal de regex Ruby /some regex/ ou ~= . C’est possible?

%r{} est équivalent à la notation /.../ , mais vous permet d’avoir ‘/’ dans votre expression rationnelle sans avoir à y échapper:

 %r{/home/user} 

est équivalent à:

 /\/home\/user/ 

Ceci est seulement un produit de syntaxe, pour la lisibilité.

Modifier:

Notez que vous pouvez utiliser presque toutes les paires de caractères non alphabétiques au lieu de ‘{}’. Ces variantes fonctionnent tout aussi bien:

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

\. => contient un point
(gif|jpg|jpeg|png) => alors, l’une de ces extensions
$ => la fin, rien après
i => insensible à la casse

Et c’est la même chose que d’écrire /\.(gif|jpg|jpeg|png)$/i .

Avec %r , vous pouvez utiliser des délimiteurs.

Vous pouvez utiliser %r{} ou %r[] ou %r!! etc.

L’avantage d’utiliser d’autres délimiteurs est que vous n’avez pas besoin d’échapper au / utilisé dans le littéral regex normal.

cette expression rationnelle correspond à toutes les chaînes qui se terminent par .gif, .jpg …

vous pourriez le remplacer par

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

Cela signifie que image_file_name doit se terminer ( $ ) par un point et un autre par gif, jpg, jpeg ou png.

Oui %r{} signifie exactement la même chose que // mais dans %r{} vous n’avez pas besoin de vous échapper / .