モデルにはフィールドがあります
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
それは私にはかなり奇妙に見えます。これは正規表現であることを認識しています。しかし、私はしたい:
- それが正確に何を意味するのかを知るために。
%r{value}等しい?/value/_ - 通常のRuby正規表現演算子
/some regex/またはで置き換えることができ~=ます。出来ますか?
モデルにはフィールドがあります
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
それは私にはかなり奇妙に見えます。これは正規表現であることを認識しています。しかし、私はしたい:
%r{value}等しい?/value/_/some regex/またはで置き換えることができ~=ます。出来ますか?%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
を使用すると%r、任意の区切り文字を使用できます。
%r{}または%r[]などを使用できます%r!!。
/他のデリメータを使用する利点は、通常の正規表現リテラルで使用されているものをエスケープする必要がないことです。
\.=>ドットが含まれています
(gif|jpg|jpeg|png)=>次に、これらの拡張機能のいずれか
$=>終わり、その後は何もありません
i=>大文字と小文字は区別されません
そしてそれは書くことと同じ/\.(gif|jpg|jpeg|png)$/iです。
この正規表現は、.gif、.jpgで終わるすべての文字列に一致します。
あなたはそれを置き換えることができます
/\.(gif|jpg|jpeg|png)$/i
これは、ドットとgif、jpg、jpeg、またはpngのいずれかでimage_file_name終了()する必要があることを意味します。$
はい%r{}はとまったく同じ意味です//が%r{}、エスケープする必要はありません/。