Biểu thức Ruby% r {}


131

Trong một mô hình có một lĩnh vực

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

Nó trông khá kỳ lạ đối với tôi. Tôi biết rằng đây là một biểu thức thường xuyên. Nhưng tôi muốn:

  • để biết chính xác nó có nghĩa là gì. Có %r{value}bằng /value/?
  • có thể thay thế nó bằng toán tử regex Ruby bình thường /some regex/hoặc ~=. Có thể không?

Câu trả lời:


254

%r{}tương đương với /.../ký hiệu, nhưng cho phép bạn có '/' trong biểu thức chính quy mà không cần phải thoát chúng:

%r{/home/user}

tương đương với:

/\/home\/user/

Đây chỉ là một hàng hóa cú pháp, cho mức độ dễ đọc.

Biên tập:

Lưu ý rằng bạn có thể sử dụng hầu hết mọi cặp ký tự không phải là chữ cái thay vì '{}'. Những biến thể này cũng hoạt động tốt:

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

Chỉnh sửa 2:

Lưu ý rằng %r{}xbiến thể bỏ qua khoảng trắng, làm cho các biểu thức phức tạp dễ đọc hơn. Ví dụ từ hướng dẫn phong cách Ruby của GitHub :

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

5
Các downvote chỉ 1 giờ trước. Đối với không gian là dấu phân cách, điều này thật tuyệt vời, nhưng không phải là thứ tôi sẽ giới thiệu và có thể đọc mã của bạn mà không bị nhầm lẫn sáu tháng sau :)
Eureka

3
Nếu bạn sử dụng khoảng trắng làm dấu phân cách, biểu thức chính quy của bạn sẽ bị hỏng nếu bạn thêm khoảng trắng vào sau. Tôi nghĩ ý tưởng là sử dụng các dấu phân cách không khớp với bất kỳ thứ gì trong biểu thức thông thường của bạn, với dấu ngoặc nhọn làm mặc định ưa thích.
Steven Hirlston

1
Gần như thể ruby ​​được thiết kế để viết mã khủng khiếp nhất có thể
Roman

Không hiểu ghi chú của lần chỉnh sửa thứ hai của bạn. Có gì đặc biệt %r{}x? /.../xcũng bỏ qua khoảng trắng. Đây không phải là thuộc tính đặc biệt của %rcú pháp. Tất cả các tùy chọn có thể làm theo /../cũng có thể làm theo %r{}.
Mecki

9

\.=> chứa một dấu chấm
(gif|jpg|jpeg|png)=> sau đó, một trong những tiện ích mở rộng này
$=> kết thúc, không có gì sau nó
i=> trường hợp không nhạy cảm

Và nó cũng giống như viết /\.(gif|jpg|jpeg|png)$/i.


Là% r {value} bằng / value /?
Alexandre

Vâng, nó giống nhau. - Như %w[1 2 3]là giống như [1, 2, 3]ví dụ.
Samy Dindane

6
%w[1 2 3]không giống như [1, 2, 3]. Nó giống như ['1', '2', '3'].
Jörg W Mittag

@ JörgWMittag Cảm ơn đã cải chính.
Samy Dindane

9

Với %r, bạn có thể sử dụng bất kỳ dấu phân cách.

Bạn có thể sử dụng %r{}hoặc %r[]hoặc %r!!vv

Lợi ích của việc sử dụng các đồng hồ đo khác là bạn không cần phải thoát khỏi /sử dụng theo nghĩa đen thông thường.


3

biểu thức chính này phù hợp với tất cả các chuỗi kết thúc bằng .gif, .jpg ...

bạn có thể thay thế nó bằng

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

1

Nó có nghĩa là image_file_namephải kết thúc ( $) bằng dấu chấm và một trong gif, jpg, jpeg hoặc png.

%r{}nghĩa chính xác giống như //nhưng trong %r{}bạn không cần phải trốn thoát /.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.