2010-08-19 38 views
22

Thông thường khi mẫu regex của tôi trông như thế này:Một cách khác thay vì thoát khỏi các mẫu regex?

http://www.microsoft.com/ 

Sau đó, tôi phải thoát khỏi nó như thế này:

string.match(/http:\/\/www\.microsoft\.com\//) 

Có một cách khác thay vì thoát nó như vậy?

Tôi muốn có thể sử dụng nó như thế này http://www.microsoft.com, vì tôi không muốn thoát khỏi tất cả các ký tự đặc biệt trong tất cả các mẫu của tôi.

Trả lời

58
Regexp.new(Regexp.quote('http://www.microsoft.com/')) 

Regexp.quote chỉ cần thoát bất kỳ ký tự nào có ý nghĩa regexp đặc biệt; phải mất và trả về một chuỗi. Lưu ý rằng . cũng đặc biệt. Sau khi trích dẫn, bạn có thể gắn thêm vào regexp nếu cần trước khi chuyển đến hàm tạo. Một ví dụ đơn giản:

Regexp.new(Regexp.quote('http://www.microsoft.com/') + '(.*)') 

Điều này sẽ thêm nhóm chụp cho phần còn lại của đường dẫn.

+5

Tất nhiên việc này quá: 'string.match (/ # {Regexp.quote ('http://www.microsoft.com/')} /) ' –

+0

thay thế tất cả các mã thông báo" CURRENT_YEAR "bằng nhóm chụp năm bốn chữ số: ' Regexp.new (input_string.split ("CURRENT_YEAR") Bản đồ {| p | Regexp.quote (p)} .join ("(\\ d {4})")) ' –

+0

Cho rằng, điều này có nên trả về thành công không? đặt "Thành công" nếu Regexp.new (Regexp.quote ('.')). Match ('A') – Joe

4

Regexp.quote hoặc Regexp.escape thể được sử dụng để tự động thoát khỏi điều cho bạn:

http://ruby-doc.org/core/classes/Regexp.html#M001195

Kết quả có thể được chuyển tới Regexp.new để tạo ra một đối tượng biểu thức chính quy, và sau đó bạn có thể gọi .match phương pháp của đối tượng và vượt qua nó là chuỗi để khớp với (thứ tự ngược lại từ string.match(/regex/)).

8

Bạn cũng có thể sử dụng delimiters tùy ý trong Ruby cho biểu thức thông thường bằng cách sử dụng% r và xác định một nhân vật trước khi biểu hiện thường xuyên, ví dụ:

%r!http://www.microsoft.com/! 
+6

Mặc dù điều này giúp tránh trốn thoát các ký tự '/', nó không giúp ích cho những thứ như dấu ngoặc đơn, dấu ngoặc đơn và các ký tự đặc biệt khác. – Amber

+3

"http://www-microsoft.com/" phù hợp. Nguy hiểm. – kuboon

0

Bạn chỉ có thể sử dụng dấu ngoặc đơn để tẩu thoát.

string.match('http://www.microsoft.com/') 

bạn cũng có thể sử dụng %q{} nếu bạn cần dấu ngoặc đơn trong văn bản. Nếu bạn cần phải có biến ngoại suy bên trong chuỗi, sau đó sử dụng %Q{}. Tương đương với dấu ngoặc kép ". Nếu chuỗi chứa biểu thức regex (ví dụ: .*?()[]^$) mà bạn muốn ngoại suy, sử dụng // hoặc% r {}

-2

Để thuận tiện tôi chỉ xác định

def regexcape(s) 
    Regexp.new(Regexp.escape(s)) 
end 
Các vấn đề liên quan