2012-09-12 6 views
95

In einem Modell gibt es ein FeldThe Ruby% r {} Ausdruck

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

Es ist für mich ziemlich seltsam aussieht. Ich bin mir bewusst, dass dies ein regelmäßiger Ausdruck ist. Aber ich möchte:

  • um zu wissen, was genau es bedeutet. Ist %r{value} gleich /value/?
  • in der Lage sein, es durch normalen Ruby-Regex-Operator /some regex/ oder ~= zu ersetzen. Ist es möglich?

Antwort

203

%r{} entspricht die /.../ Notation, sondern ermöglicht es Ihnen, '/' in Ihrem regulären Ausdruck zu haben, ohne sie zu entkommen mit:

%r{/home/user} 

entspricht:

/\/home\/user/ 

Dies ist nur eine Syntaxware zur Lesbarkeit.

Edit:

Beachten Sie, dass Sie fast jedes nicht-alphabetisches Zeichen Paar anstelle von '{}' benutzen. Diese Varianten funktionieren genauso gut:

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

Sogar 're =% r/home/user' funktioniert (mit Leerzeichen als Trennzeichen). – jdoe

+2

Der Downvote war nur 1 Stunde vor. Was Platz als Trennzeichen betrifft, ist das großartig, aber nicht die Art von Dingen, die ich empfehlen werde, um deinen Code zu lesen, ohne sechs Monate später verwirrt zu sein :) – Eureka

+1

Wenn du Leerzeichen als Trennzeichen verwendest, wird dein regulärer Ausdruck bei dir brechen fügen Sie später Leerzeichen hinzu. Ich denke, die Idee ist, Trennzeichen zu verwenden, die nichts in Ihrem regulären Ausdruck entsprechen, mit geschweiften Klammern als bevorzugter Standard. –

2

diese regexp passt auf alle Zeichenfolgen, die mit .gif endet, JPG ...

Sie es mit

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

Hat es den Namen? – Alexandre

7

\. => enthält einen Punkt
(gif|jpg|jpeg|png) => dann ersetzen könnte , entweder eine dieser Erweiterungen
$ => das Ende, nichts danach
i => case insensitive

Und es ist das gleiche wie Schreiben /\.(gif|jpg|jpeg|png)$/i.

+0

Ist% r {Wert} gleich/Wert /? – Alexandre

+0

Ja, es ist das gleiche. - Als '% w [1 2 3]' ist zum Beispiel dasselbe wie '[1, 2, 3]'. –

+6

'% w [1 2 3]' ist * nicht * dasselbe wie '[1, 2, 3]'.Es ist dasselbe wie '[' 1 ',' 2 ',' 3 '] '. –

0

Es bedeutet, dass image_file_name enden muss ($) mit Punkt und einer von GIF, JPG, JPEG oder PNG.

Ja %r{} bedeuten genau das gleiche wie // aber in %r{} Sie brauchen nicht / zu entkommen.

6

Mit %r, Sie Trennzeichen verwenden können.

Sie könnten %r{} oder %r[] oder %r!! usw.

Der Vorteil der Verwendung anderer Trennzeichen verwenden, ist, dass Sie die / nicht wörtliche in normalen regex verwendet entkommen müssen.

+0

Was bedeutet% r [] oder% r !! bedeuten? – Alexandre

+2

Es ist dasselbe wie '% r {}' – xdazz