好的,我现在感觉很厚。基本上,我想定义一个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
答案 0 :(得分:7)
我会选择简单地否定匹配,如Linus Kleen's answer中所述。但是,如果你绝对必须在正则表达式(或学习经验或其他东西)中完成所有这些,那么我认为以下内容应该有效:
^((dog|cat(?!$)).+|(?!dog|cat).+)$
这在交替使用两个负向前瞻。第一个是“匹配cat
或dog
,如果后面没有字符串结尾($
),则后跟其他任何内容”。这与dogsled
和cats
以及那种性质相匹配。
交替的后半部分说“确保字符串的开头(^
)后面没有dog
或cat
(因此它不会以任何一个开头)那些),然后匹配任何东西“。这可以为您提供不以cat
或dog
开头的任何字词(例如banana
)。
答案 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)?.+/