2012-01-13 61 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

相关问题