L'espressione Ruby% r {}


131

In un modello c'è un campo

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

Mi sembra abbastanza strano. Sono consapevole che questa è un'espressione regolare. Ma mi piacerebbe:

  • per sapere cosa significa esattamente. È %r{value}uguale a /value/?
  • essere in grado di sostituirlo con il normale operatore regex di Ruby /some regex/o ~=. È possibile?

Risposte:


254

%r{}equivale alla /.../notazione, ma ti permette di avere '/' nella tua regexp senza doverli sfuggire:

%r{/home/user}

è equivalente a:

/\/home\/user/

Questa è solo una merce di sintassi, per leggibilità.

Modificare:

Si noti che è possibile utilizzare quasi qualsiasi coppia di caratteri non alfabetici anziché "{}". Queste varianti funzionano altrettanto bene:

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

Modifica 2:

Nota che la %r{}xvariante ignora gli spazi bianchi, rendendo più leggibili le regexp complesse. Esempio dalla guida allo stile Ruby di GitHub :

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

5
Il downvote è stato solo 1 ora fa. Per quanto riguarda lo spazio come delimitatore, questo è fantastico, ma non è il genere di cose che consiglierò di poter leggere il tuo codice senza essere perplesso sei mesi dopo :)
Eureka,

3
Se usi gli spazi come delimitatore, la tua espressione regolare si interromperà se aggiungi degli spazi in un secondo momento. Penso che l'idea sia quella di utilizzare delimitatori che non corrispondono a nulla nella tua espressione regolare, con parentesi graffe come impostazione predefinita preferita.
Steven Hirlston,

1
È quasi come se ruby ​​fosse progettato per scrivere il codice più orribile possibile
Roman

Non capisco la nota della tua seconda modifica. Di cosa si tratta %r{}x? /.../xignora anche gli spazi bianchi. Questa non è una proprietà speciale della %rsintassi. Possono seguire /../anche tutte le opzioni che possono seguire %r{}.
Mecki,

9

\.=> contiene un punto
(gif|jpg|jpeg|png)=> quindi, una di queste estensioni
$=> la fine, niente dopo
i= = maiuscole e minuscole

Ed è lo stesso della scrittura /\.(gif|jpg|jpeg|png)$/i.


% R {valore} è uguale a / valore /?
Alexandre,

Sì, è lo stesso. - Come %w[1 2 3]è lo stesso [1, 2, 3]per esempio.
Samy Dindane,

6
%w[1 2 3]non è lo stesso di [1, 2, 3]. È lo stesso di ['1', '2', '3'].
Jörg W Mittag,

@ JörgWMittag Grazie per la rettifica.
Samy Dindane,

9

Con %r, è possibile utilizzare qualsiasi delimitatore.

Puoi usare %r{}o %r[]o %r!!ecc.

Il vantaggio dell'uso di altri delimitatori è che non è necessario sfuggire all'usato /nel normale regex letterale.


3

questa regexp corrisponde a tutte le stringhe che terminano con .gif, .jpg ...

potresti sostituirlo con

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

1

Significa che image_file_namedeve finire ( $) con punto e uno di gif, jpg, jpeg o png.

Sì, %r{}significa esattamente lo stesso di //ma %r{}non è necessario scappare /.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.