150

モデルにはフィールドがあります

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

それは私にはかなり奇妙に見えます。これは正規表現であることを認識しています。しかし、私はしたい:

  • それが正確に何を意味するのかを知るために。%r{value}等しい?/value/_
  • 通常のRuby正規表現演算子/some regex/またはで置き換えることができ~=ます。出来ますか?
4

5 に答える 5

288

%r{}表記と同等/.../ですが、エスケープせずに正規表現に「/」を含めることができます。

%r{/home/user}

と同等です:

/\/home\/user/

これは、読みやすくするための構文上の商品にすぎません。

編集:

'{}'の代わりに、ほとんどすべての非アルファベット文字ペアを使用できることに注意してください。これらのバリアントも同様に機能します。

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

編集2:

%r{}xバリアントは空白を無視し、複雑な正規表現を読みやすくすることに注意してください。GitHubのRubyスタイルガイドの例:

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x
于 2012-09-12T09:10:22.250 に答える
11

を使用すると%r、任意の区切り文字を使用できます。

%r{}または%r[]などを使用できます%r!!

/他のデリメータを使用する利点は、通常の正規表現リテラルで使用されているものをエスケープする必要がないことです。

于 2012-09-12T09:15:17.363 に答える
9

\.=>ドットが含まれています
(gif|jpg|jpeg|png)=>次に、これらの拡張機能のいずれか
$=>終わり、その後は何もありません
i=>大文字と小文字は区別されません

そしてそれは書くことと同じ/\.(gif|jpg|jpeg|png)$/iです。

于 2012-09-12T09:09:40.557 に答える
3

この正規表現は、.gif、.jpgで終わるすべての文字列に一致します。

あなたはそれを置き換えることができます

/\.(gif|jpg|jpeg|png)$/i
于 2012-09-12T09:08:35.103 に答える
1

これは、ドットとgif、jpg、jpeg、またはpngのいずれかでimage_file_name終了()する必要があることを意味します。$

はい%r{}はとまったく同じ意味です//%r{}、エスケープする必要はありません/

于 2012-09-12T09:10:21.140 に答える