2012-01-13 44 views
8

好的,我現在感覺很厚。基本上,我想要定義一個JavaScript正則表達式,該表達式將匹配除之外的任何正好是特定的字符串。所以說我有串定義一個JavaScript正則表達式,匹配除特定字符串以外的任何內容

"dog" 

"cat" 

我想要一個獨立的正則表達式,它將匹配字符串

"dogsled" 

或字符串

"cattle" 

只是沒有「狗」或「貓」是自己的。我已經試過這一點,這基本上說,忽略任何與「貓」和「狗」,這不正是我需要的開始......

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 

這必須是簡單的....謝謝!

編輯 只是爲了澄清,我不想做返回值的任何否定得到結果我want-正則表達式應該返回「狗拉雪橇」或假的假的「狗」和真正的「貓」和真正的‘黃牛’

+2

+1實際上給正則表達式去。所以很多[標籤:正則表達式]問題只是「我可以有代碼」的風格。 – Matt 2012-01-13 15:47:38

+4

爲什麼不簡單地否定? '!string.match(/^dog | cat $ /)' – 2012-01-13 15:49:22

+0

@LinusKleen哈哈哈一個正則表達式問題的好用戶名:-) – Pointy 2012-01-13 15:51:00

回答

6

我會選擇只是否定Linus Kleen's answer中提到的匹配。但是,如果你絕對必須做這一切的正則表達式(或學習經驗或東西),那麼我認爲有以下應該工作:

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

這在交替使用兩個負向前看符號。第一個表示「匹配catdog,如果它沒有跟隨字符串字符的結尾($),則跟隨其他任何」。這匹配dogsledcats和那種性質的東西。

交替下半年寫着「確保字符串(^)的開頭後面沒有dogcat(所以它不會和這兩個的開始),然後匹配任何東西」。這會得到任何不以catdog(如banana)開頭的單詞。

Here's an example on regexpal

+0

優秀。另外兩個(如果我可以)。 – 2012-01-13 16:23:56

+0

@ eldarerathis-正則表達式的唯一匹配要求是集成約束,這很適合!簡單的否定也是我的偏好,但是這是有效的。謝謝! – VLostBoy 2012-01-13 18:05:18

0

我想這應該做的伎倆:

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

這匹配'dog'和「貓」。 – eldarerathis 2012-01-13 15:56:46

+0

幾乎 - 這滿足了相反的情況... – VLostBoy 2012-01-13 16:03:07

4

我似乎記得負先行斷言((?! ...))將無法完全在所有JavaScript解釋器的支持。對正則表達式的結果的簡單否定也應該足夠,不是嗎?

var pattern = /^cat|dog$/; 

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

真的嗎?我知道JavaScript不支持向後看,但我沒有意識到任何與lookaheads(正面或負面)的問題。 – Wiseguy 2012-01-13 15:59:57

+0

加一個用於分析實際問題的好問題 – davogotland 2012-01-13 16:13:20

相關問題