定义匹配除特定字符串之外的任何内容的JavaScript正则表达式

时间:2012-01-13 15:45:44

标签: javascript regex

好的,我现在感觉很厚。基本上,我想定义一个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

这必须简单....谢谢!

修改 只是为了澄清,我不想对返回值做任何否定以获得我想要的结果 - 正则表达式应该为“dog”返回false,对于“dogled”则为true,对于“cat”则为false,对于“cattle”则为true

3 个答案:

答案 0 :(得分:7)

我会选择简单地否定匹配,如Linus Kleen's answer中所述。但是,如果你绝对必须在正则表达式(或学习经验或其他东西)中完成所有这些,那么我认为以下内容应该有效:

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

这在交替使用两个负向前瞻。第一个是“匹配catdog,如果后面没有字符串结尾($),则后跟其他任何内容”。这与dogsledcats以及那种性质相匹配。

交替的后半部分说“确保字符串的开头(^)后面没有dogcat(因此它不会以任何一个开头)那些),然后匹配任何东西“。这可以为您提供不以catdog开头的任何字词(例如banana)。

Here's an example on regexpal

答案 1 :(得分:4)

我似乎回想起所有Javascript解释器都不完全支持负面预见断言((?! ... ))。对正则表达式结果的简单否定也应该足够了,不是吗?

var pattern = /^cat|dog$/;

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

答案 2 :(得分:0)

我认为这应该可以解决问题:

/^(dog|cat)?.+/