Der Ruby% r {} Ausdruck

131

In einem Modell gibt es ein Feld

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

Es sieht ziemlich seltsam für mich aus. Mir ist bewusst, dass dies ein regulärer Ausdruck ist. Aber ich möchte:

  • zu wissen, was es genau 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?
Alexandre
quelle

Antworten:

254

%r{}entspricht der /.../Notation, ermöglicht es Ihnen jedoch, '/' in Ihrem regulären Ausdruck zu haben, ohne ihnen entkommen zu müssen:

%r{/home/user}

ist äquivalent zu:

/\/home\/user/

Dies ist aus Gründen der Lesbarkeit nur eine Syntaxware.

Bearbeiten:

Beachten Sie, dass Sie anstelle von '{}' fast jedes nicht-alphabetische Zeichenpaar verwenden können. Diese Varianten funktionieren genauso gut:

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

Bearbeiten 2:

Beachten Sie, dass die %r{}xVariante Leerzeichen ignoriert, wodurch komplexe reguläre Ausdrücke besser lesbar werden. Beispiel aus dem Ruby- Styleguide von GitHub :

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x
Eureka
quelle
5
Die Abstimmung war nur vor 1 Stunde. Was den Platz als Begrenzer betrifft, ist dies fantastisch, aber nicht die Art von Dingen, die ich empfehlen werde, um Ihren Code lesen zu können, ohne sechs Monate später verwirrt zu sein :)
Eureka
3
Wenn Sie Leerzeichen als Trennzeichen verwenden, wird Ihr regulärer Ausdruck unterbrochen, wenn Sie später Leerzeichen hinzufügen. Ich denke, die Idee ist, Trennzeichen zu verwenden, die mit nichts in Ihrem regulären Ausdruck übereinstimmen, wobei geschweifte Klammern die bevorzugte Standardeinstellung sind.
Steven Hirlston
1
Es ist fast so, als ob Ruby entworfen wurde, um so schrecklichen Code wie möglich zu schreiben
Roman
Verstehe den Hinweis deiner zweiten Bearbeitung nicht. Was ist das Besondere %r{}x? /.../xignoriert auch Leerzeichen. Dies ist keine spezielle Eigenschaft der %rSyntax. Alle Optionen, die folgen /../können , können auch folgen %r{}.
Mecki
9

\.=> enthält einen Punkt
(gif|jpg|jpeg|png)=> dann eine dieser Erweiterungen
$=> das Ende, nichts danach
i => Groß- und Kleinschreibung wird nicht berücksichtigt

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

Samy Dindane
quelle
Ist% r {Wert} gleich / Wert /?
Alexandre
Ja, es ist das gleiche. - Wie %w[1 2 3]ist die gleiche wie [1, 2, 3]zum Beispiel.
Samy Dindane
6
%w[1 2 3]ist nicht dasselbe wie [1, 2, 3]. Es ist das gleiche wie ['1', '2', '3'].
Jörg W Mittag
@ JörgWMittag Danke für die Korrektur.
Samy Dindane
9

Mit %rkönnen Sie beliebige Trennzeichen verwenden.

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

Der Vorteil der Verwendung anderer Begrenzer besteht darin, dass Sie dem /im normalen Regex-Literal verwendeten nicht entkommen müssen.

xdazz
quelle
3

Dieser reguläre Ausdruck entspricht allen Zeichenfolgen, die mit .gif, .jpg ... enden.

Sie könnten es durch ersetzen

/\.(gif|jpg|jpeg|png)$/i
Erez Rabih
quelle
1

Dies bedeutet, dass image_file_nameend ( $) mit einem Punkt und einem von gif, jpg, jpeg oder png enden muss .

Ja %r{}bedeutet genau das gleiche wie //aber %r{}du musst nicht entkommen /.

Hauleth
quelle