Ruby% r {} ifadesi


131

Bir modelde bir alan var

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

Bana oldukça tuhaf görünüyor. Bunun normal bir ifade olduğunun farkındayım. Ama ben istiyorum:

  • tam olarak ne anlama geldiğini bilmek için. Mı %r{value}eşit /value/?
  • normal Ruby regex operatörü /some regex/veya ~=. Mümkün mü?

Yanıtlar:


254

%r{}/.../gösterime eşdeğerdir , ancak normal ifadenizde onlardan kaçmak zorunda kalmadan '/' bulunmasına izin verir:

%r{/home/user}

eşdeğerdir:

/\/home\/user/

Bu, okunaklılık açısından yalnızca bir sözdizimi metasıdır.

Düzenle:

Hemen hemen tüm alfabetik olmayan karakter çiftlerini '{}' yerine kullanabileceğinizi unutmayın. Bu varyantlar da aynı şekilde çalışır:

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

Düzenleme 2:

%r{}xVaryantın beyaz boşluğu yok saydığını ve karmaşık normal ifadeleri daha okunaklı hale getirdiğini unutmayın . Örnek Github Ruby stil kılavuzu :

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

5
Olumsuz oy yalnızca 1 saat önceydi. Sınırlayıcı olarak uzaya gelince, bu harika, ancak kodunuzu altı ay sonra şaşkınlığa uğramadan okuyabilmem için tavsiye edeceğim türden bir şey değil :)
Eureka

3
Sınırlayıcı olarak boşluk kullanırsanız, daha sonra boşluk eklerseniz normal ifadeniz kesilir. Sanırım ana fikir, normal ifadenizdeki hiçbir şeyle eşleşmeyen sınırlayıcıları, tercih edilen varsayılan olarak küme ayraçları kullanmaktır.
Steven Hirlston

1
Sanki Ruby, olabildiğince korkunç bir kod yazmak için tasarlanmış gibi
Roman

İkinci düzenlemenizin notunu anlamayın. Özel olan ne %r{}x? /.../xboşlukları da yok sayar. Bu %rsöz diziminin özel bir özelliği değildir . Takip /../edebilecek tüm seçenekler de takip edebilir %r{}.
Mecki

9

\.=> bir nokta içerir
(gif|jpg|jpeg|png)=> o zaman, bu uzantılardan biri
$=> son, ondan sonra hiçbir şey yok
i=> büyük / küçük harfe duyarlı değil

Ve yazmakla aynı şey /\.(gif|jpg|jpeg|png)$/i.


% R {değer}, / değer / değerine eşit mi?
Alexandre

Evet aynısı. - Örneğin %w[1 2 3]olduğu gibi [1, 2, 3].
Samy Dindane

6
%w[1 2 3]ile aynı değil[1, 2, 3] . İle aynıdır ['1', '2', '3'].
Jörg W Mittag

@ JörgWMittag Düzeltme için teşekkürler.
Samy Dindane

9

İle %rherhangi bir sınırlayıcı kullanabilirsiniz.

Sen kullanabilirsiniz %r{}ya %r[]ya %r!!vs.

Diğer ayırıcıları kullanmanın yararı, /normal normal regex literalinde kullanılanlardan kaçmanız gerekmemesidir .


3

bu normal ifade .gif, .jpg ... ile biten tüm dizelerle eşleşir.

ile değiştirebilirsin

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

1

Bunun anlamı image_file_name( $) nokta ve gif, jpg, jpeg veya png ile bitmelidir .

Evet %r{}tam olarak aynı anlama geliyor //ama içinde %r{}kaçmanıza gerek yok /.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.