Ruby%r {}式


131

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

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

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

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

回答:


254

%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

5
反対票は1時間前のみでした。区切り文字としてのスペースに関しては、これは素晴らしいですが、6か月後に戸惑うことなくコードを読み取ることができるように勧めるようなものではありません:)
Eureka

3
スペースを区切り文字として使用する場合、後でスペースを追加すると、正規表現が壊れます。私の考えでは、正規表現の何にも一致しない区切り文字を使用し、中かっこをデフォルトとして使用することです。
Steven Hirlston、2015年

1
Rubyが恐ろしいコードをできるだけ書くように設計されているかのようです
Roman

2番目の編集のメモを理解していません。何が特別なの%r{}xですか?/.../x空白も無視します。これは%r構文の特別なプロパティではありません。従う/../ことができるすべてのオプションも従うことができます%r{}
メッキ

9

\.=>ドットを含む
(gif|jpg|jpeg|png)=>次に、これらの拡張機能のいずれか
$=>終わり、それ以降は何も
i=>大文字と小文字を区別しない

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


%r {value}は/ value /と等しいですか?
アレクサンドル

はい、同じです。- 例%w[1 2 3]として同じ[1, 2, 3]です。
Samy Dindane 2012

6
%w[1 2 3]と同じではありません[1, 2, 3]。と同じ['1', '2', '3']です。
イェルクWミッターク

@JörgWMittag修正ありがとうございます。
Samy Dindane 2012

9

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

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

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


3

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

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

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

1

つまり、image_file_name末尾が($)のドットと、gif、jpg、jpeg、pngのいずれかである必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.