2010-01-16 20 views
160

Tôi có một biểu thức chính quy như sau:Một biểu thức chính quy để loại trừ một từ/chuỗi

^/[a-z0-9]+$ 

này phù hợp với chuỗi như /hello hoặc /hello123.

Tuy nhiên, tôi muốn loại trừ một vài giá trị chuỗi như /ignoreme/ignoreme2.

Tôi đã thử một vài biến thể nhưng dường như không có bất kỳ hoạt động nào!

nỗ lực yếu ớt mới nhất của tôi đã

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$ 

Bất kỳ trợ giúp sẽ được đánh giá cao lòng biết ơn :-)

+0

Có thể trùng lặp: http://stackoverflow.com/questions/1395177/regex-to-exclude-a-specific-string-constant –

Trả lời

215

Dưới đây là chưa một cách khác: (sử dụng một negative look-ahead):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Lưu ý: Chỉ có duy nhất một biểu thức chụp: ([a-z0-9]+).

+1

Rực rỡ, điều đó dường như đã thực hiện thủ thuật. Tôi thực sự cần quy tắc này để viết lại url và tôi muốn bỏ qua thư mục "hình ảnh", "css" và "js". Vì vậy, quy tắc của tôi như sau: ^/(?! css | js | hình ảnh) ([az] +) /? (\? (. +))? $ và ghi đè lên /Profile.aspx?id= $ 1 & $ 3 Quy tắc này có hoạt động chính xác và truyền bá chuỗi truy vấn không? Vì vậy, nếu ai đó truy cập http://mydomain.com/hello?abc=123 Tôi muốn viết lại nó lên http://mydomain.com/Profile.aspx?id=hello&abc=123 Tôi cũng là bit không chắc chắn về hiệu suất của (. +) ở cuối để nắm bắt chuỗi truy vấn trong yêu cầu ban đầu. – romiem

+0

Âm thanh như thế này là một câu hỏi khác. Regexp mà bạn có vẻ như nó sẽ nắm bắt chuỗi truy vấn - kiểm tra và xem chuỗi truy vấn của bạn có xuất hiện không. Ngoài ra - '(\? (. +))?$ 'nên nhanh. Tôi sẽ không lo lắng quá nhiều về tốc độ. – Seth

+0

Điều này không hiệu quả đối với tôi, trong khi giải pháp của Alix Axel đã hoạt động. Tôi đang sử dụng lớp 'java.util.regex.Pattern' của Java. –

10

Như bạn muốn loại trừ cả hai từ, bạn cần một conjuction:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$ 

Bây giờ cả hai điều kiện phải đúng (không phải ignoreme cũng không phải ignoreme2 được phép) để có atch.

+0

Điều này tương đương với cái ngắn hơn ở trên, đó là dấu hiệu tiêu cực của một tập hợp các lựa chọn thay thế . – ChrisF

+1

@ChrisF Không, không thực sự. Giải pháp của Seth sẽ không khớp với một cái gì đó như '/ ignoremenot' như là'/'được theo sau bởi' ignoreme'. – Gumbo

26

này nên làm điều đó:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3) 

Bạn có thể thêm càng nhiều phớt lờ những lời như bạn muốn, đây là một đơn giản thực hiện PHP:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...'); 

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string); 
+0

Tôi nghĩ rằng nhìn phía sau đòi hỏi một mô hình chiều rộng cố định? – simon

+0

@simon: Có phải không? –

+2

@AlixAxel Nó có, nhưng libex regex thông minh hơn sẽ cho phép thay đổi với độ dài thay đổi cho các lựa chọn thay thế (và sử dụng dài nhất), miễn là mỗi thay thế có độ dài cố định. – ChrisF

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