2008-10-06 72 views
47

Tôi có một số URL và tôi đang cố gắng đối sánh nó với cụm từ thông dụng để kéo ra một số nhóm. Vấn đề tôi gặp phải là URL có thể kết thúc hoặc tiếp tục với văn bản URL "/" và nhiều hơn nữa. Tôi muốn để phù hợp với URL như thế này:Regex để khớp với URL cuối dòng hoặc ký tự "/"

Nhưng không phù hợp với một cái gì đó như thế này:

Vì vậy, tôi nghĩ rằng đặt cược tốt nhất của tôi là một cái gì đó như thế này:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$] 

nơi lớp nhân vật cuối cùng chứa một trong hai "/" hoặc dòng end-of-. Lớp nhân vật dường như không hài lòng với "$" trong đó. Làm thế nào tôi có thể phân biệt đối xử tốt nhất giữa các URL này trong khi vẫn kéo các nhóm chính xác?

Trả lời

37
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$ 
+0

Liệu công việc này mà không có sự thoát dấu gạch ngang? – ziggy

85

Để phù hợp với một trong hai/hoặc ở cuối nội dung, sử dụng (/|\z)

này chỉ áp dụng nếu bạn không sử dụng kết hợp nhiều dòng (tức là bạn đang phù hợp với một URL duy nhất, không phải là một danh sách xuống dòng được phân định của URL).


Để đưa rằng với một phiên bản cập nhật của những gì bạn có:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z) 

Lưu ý rằng tôi đã thay đổi khi bắt đầu trở thành một trận đấu không tham lam cho phi khoảng trắng (\S+?) chứ không phải là phù hợp với bất cứ điều gì và tất cả mọi thứ (.*)

+4

Làm cách nào để cung cấp cho bạn nhiều điểm hơn;) Cảm ơn vì điều này. Chỉ cần để tài liệu (/ | \ A) sẽ phù hợp với dấu gạch chéo phía trước hoặc đầu chuỗi. –

48

Bạn đã có một vài regexes bây giờ sẽ làm những gì bạn muốn, vì vậy đó là đầy đủ bảo hiểm. Điều gì đã không được đề cập là lý do nỗ lực của bạn sẽ không hoạt động: Bên trong một lớp nhân vật, $ (. Cũng như ^, /) không có ý nghĩa đặc biệt, vì vậy [/ $ ] khớp với số / hoặc $ bằng chữ thay vì chấm dứt regex (/) hoặc kết thúc dòng cuối cùng ($).

+5

Đây là một cái gì đó thường xuyên bị lãng quên và không được đề cập đến trong các tài liệu regex. –

+4

Lưu ý rằng^có thể có ý nghĩa đặc biệt trong một lớp nhân vật. Nếu nó là nhân vật đầu tiên trong lớp, nó làm cho nó một lớp tiêu cực mà sẽ phù hợp với bất cứ điều gì ngoại trừ các nhân vật khác. ví dụ. để khớp với bất kỳ thứ gì ngoại trừ a hoặc b, bạn có thể sử dụng [^ ab]. Để bao gồm chữ ^, chỉ cần đảm bảo nó không phải là đầu tiên, do đó, để khớp với a, b hoặc^bạn sẽ sử dụng [ab ^]. –

7

Trong Ruby và Bash, bạn có thể sử dụng $ bên trong dấu ngoặc đơn.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$) 

(Giải pháp này cũng tương tự như Pete Boughton, nhưng bảo việc sử dụng $, có nghĩa là cuối dòng, thay vì sử dụng \z, có nghĩa là kết thúc chuỗi.)

+2

PHP quá từ những gì tôi có thể nói. Tôi không thấy lý do tại sao '$' không thể được sử dụng trong ngoặc đơn '()' trong bất kỳ thực hiện nào. Đó là dấu ngoặc '[]' làm cho nó theo nghĩa đen. –

+2

'$' hoạt động theo cách này trong javascript, trong khi '\ z' thì không (Chrome 48, Firefox 43, IE9). –

+1

Đây là tùy chọn thẳng thắn nhất. Khớp dấu gạch chéo hoặc cuối dòng. Nó thậm chí phù hợp với tiêu đề của câu hỏi này! –

Các vấn đề liên quan