2012-01-13 33 views
8

Ok, hiện tại tôi cảm thấy khá dày. Về cơ bản, tôi muốn xác định biểu thức chính quy JavaScript sẽ khớp với bất kỳ thứ gì ngoại trừ chính xác một chuỗi cụ thể. Vì vậy, nói tôi có chuỗiXác định biểu thức chính quy JavaScript khớp với bất kỳ thứ gì ngoại trừ một chuỗi cụ thể

"dog" 

hoặc

"cat" 

Tôi muốn có một biểu thức chính quy độc lập đơn như vậy mà nó sẽ phù hợp với chuỗi

"dogsled" 

hoặc chuỗi

"cattle" 

Chỉ cần không phải "chó" hoặc "mèo" trên đó s riêng. Tôi đã cố gắng này, mà về cơ bản nói, bỏ qua bất cứ điều gì bắt đầu với "mèo" hay "con chó", mà không phải là chính xác những gì tôi cần ...

var pattern= /^(?!dog|cat).+/ 

pattern.test("cat") // false, as expected 
pattern.test("dog") // false, as expected 
pattern.test("bananananana") // true 
pattern.test("dogsled") // false, but the regexp I want would return true 

này phải được đơn giản .... cảm ơn!

Sửa Chỉ cần làm rõ, tôi không muốn làm bất cứ phủ nhận giá trị trả về để có được kết quả tôi muốn- regex nên return false cho "chó" và đúng với "dogsled" hay sai cho " mèo" và đúng đối với 'bò'

+2

+1 để thực sự cung cấp cho regex. Rất nhiều câu hỏi [tag: regex] chỉ là kiểu "Tôi có thể có mã". – Matt

+4

Tại sao không đơn giản là phủ nhận? '! string.match (/^dog | cat $ /)' –

+0

@LinusKleen ha ha ha tên người dùng tuyệt vời cho một câu hỏi regex :-) – Pointy

Trả lời

6

Tôi sẽ chọn không cho đơn giản phủ nhận một kết quả phù hợp như đã nêu trong Linus Kleen's answer. Tuy nhiên, nếu bạn hoàn toàn phải làm tất cả trong regex (hoặc cho kinh nghiệm học tập hoặc một cái gì đó) sau đó tôi nghĩ rằng những điều sau đây nên làm việc:

^((dog|cat(?!$)).+|(?!dog|cat).+)$ 

này sử dụng hai lookaheads tiêu cực trong một luân phiên. Việc đầu tiên nói "Match cat hoặc dog nếu nó không được theo sau bởi sự kết thúc của chuỗi ký tự ($), tiếp theo là bất cứ điều gì khác". Điều này phù hợp với dogsledcats và những điều có tính chất đó.

Phần thứ hai của thay đổi cho biết "Hãy đảm bảo bắt đầu chuỗi (^) không được theo sau bởi dog hoặc cat (vì vậy nó không bắt đầu bằng một trong hai thứ đó), sau đó khớp với bất kỳ thứ gì". Điều này giúp bạn có bất kỳ từ nào không bắt đầu bằng cat hoặc dog (như banana).

Here's an example on regexpal.

+0

Tuyệt vời. Cộng với hai (nếu tôi có thể). –

+0

@ eldarerathis- yêu cầu đối với chỉ phù hợp với regex là giảm các ràng buộc tích hợp, và điều này phù hợp với độc đáo! Phủ định đơn giản cũng sẽ là sở thích của tôi, nhưng nó hoạt động. Cảm ơn! – VLostBoy

0

tôi nghĩ rằng điều này sẽ làm các trick:

/^(dog|cat)?.+/ 
+0

Điều này khớp với cả hai 'con chó' và 'mèo'. – eldarerathis

+0

Hầu như điều này thỏa mãn trường hợp ngược ... – VLostBoy

4

tôi dường như nhớ lại âm khẳng định nhìn về phía trước ((?! ...)) được không được hỗ trợ đầy đủ trong tất cả các thông dịch viên Javascript. Một phủ định đơn giản về kết quả của regex cũng đủ, phải không?

var pattern = /^cat|dog$/; 

!pattern.test("cat");   // => false 
!pattern.test("dog");   // => false 
!pattern.test("bananananana"); // => true 
!pattern.test("dogsled");  // => true 
+0

Thật sao? Tôi biết JavaScript không hỗ trợ lookbehinds, nhưng tôi đã không nhận thức được bất kỳ vấn đề với lookaheads (hoặc tích cực hay tiêu cực). – Wiseguy

+0

cộng một cho phân tích tốt về vấn đề thực tế – davogotland

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