为什么这个正则expression式返回匹配?

http://jsfiddle.net/sqee98xr/

var reg = /^(?!managed).+\.coffee$/ var match = '20150212214712-test-managed.coffee'.match(reg) console.log(match) // prints '20150212214712-test-managed.coffee' 

我只想匹配正则expression式,如果没有字符“pipe理”存在一个string – 我怎么能做到这一点?

消极的lookaheads是奇怪的。 你必须匹配更多的不只是你正在寻找的单词。 这很奇怪,我知道。

 var reg = /^(?!.*managed).+\.coffee$/ 

http://jsfiddle.net/sqee98xr/3/

编辑:看来我真的得到了一些人的皮肤与“怪异”描述符和描述。 这很奇怪,因为从表面上来看,“负向预测”一词意味着“向前看,并确保这些括号内的东西不在那里,然后回来继续匹配” 。 作为正则expression式的爱好者,我仍然宣称这个命名很奇怪,特别是第一次用户的断言。 对我来说,把它看作是一个“不”操作者,而不是实际上向前爬行,并“向前看”的东西比较容易。 为了使行为看起来像一个实际的“向前看”,你必须在search词之前匹配所有的东西,因此.*

更简单的解决办法是删除string开始(^)断言。 再一次,对我来说更容易阅读?! 作为“不”。

 var reg = /(?!managed).+\.coffee$/ 

@RyanWheale的解决scheme是正确的,但解释是不正确的。 原因主要是包含单词“managed” (如“test-managed” )的string可以被视为不是 “managed” 。 首先得到这个想法让我们看看正则expression式:

 /^(?!managed).+\.coffee$/ // (Not "managed")(one or more characters)(".")("coffee") 

所以首先我们不能有一个string与文本“托pipe”,那么我们可以有一个或多个字符,然后一个点,然后是文本“咖啡”。 这是一个满足这个的例子。

“Hello.coffee”[PASS]

有道理, "Hello"当然不是"managed" 。 这是另一个从你的string中工作的例子:

“20150212214712-test-managed.coffee”[PASS]

为什么? 因为“20150212214712-test-managed”不是string“托pipe”即使它包含string,计算机不知道这就是你的意思。 它认为“20150212214712-testingpipe理”作为一个不被“pipe理”的string“andflaksfj”不是“pipe理” 。 所以唯一的失败方式是如果“托pipe”是在string的开头:

“managed.coffee”[FAIL]

这不仅仅是因为文本“托pipe”在那里。 说电脑说"managed." 没有"managed" 。 它确实会传递(?!managed)部分, 其余的string只是coffee ,因为没有"."而会失败"."

最后,解决这个问题的方法和其他答案一样:

 /^(?!.*managed).+\.coffee$/ 

现在string“20150212214712-test-managed.coffee”失败了,因为不pipe它如何看待: “test-managed” -managed “st-managed”等等,仍然算作(?!.*managed)并失败。 就像上面这个例子一样,它可以尝试从".coffee"添加一个子string,但是正如所解释的,这会导致string在其余的正则expression式( .+\.coffee$ ".coffee" .+\.coffee$ )中失败。

希望这个长久的解释说明,消极的预见并不奇怪,只是从字面上理解你的要求。