负面看法正则expression式

我想匹配以“.htm”结尾的所有string,除非它以“foo.htm”结尾。 我通常体面的正则expression式,但负面的lookaheads让我难住。 为什么这不工作?

/(?!foo)\.htm$/i.test("/foo.htm"); // returns true. I want false. 

我应该使用什么呢? 我想我需要一个“负面看”的expression(如果JavaScript支持这样的事情,我知道它不)。

这个问题真的很简单。 这将做到这一点:

/^(?!.*foo\.htm$).*\.htm$/i

你所描述的(你的意图)是一个负面的外观 ,Javascript不支持后视。

从他们被放置的angular色outlook未来 – 而且你已经把它放在了前面. 。 所以,实际上,只要从该位置( .ht )开始的前三个字符都不是foo “,那么任何以.htm结尾的事物都是真的。

通常情况下,负面后顾的替代是比你需要的更多,只提取你实际需要的部分。 这很不好,根据你的确切情况,你可能会想出其他的东西,但是这样的东西:

 // Checks that the last 3 characters before the dot are not foo: /(?!foo).{3}\.htm$/i.test("/foo.htm"); // returns false 

正如前面提到的JavaScript不支持负面的后顾断言。

但是你可以使用workaroud:

 /(foo)?\.htm$/i.test("/foo.htm") && RegExp.$1 != "foo"; 

这将匹配以.htm结尾的所有内容,但是如果它与foo.htm匹配,则会将"foo"存储到RegExp.$1中,因此您可以单独处理它。

就像Renesis提到的那样,JavaScript中不支持“lookbehind”,所以也许只需要使用两个正则expression式:

 !/foo\.htm$/i.test(teststring) && /\.htm$/i.test(teststring) 

String.prototype.endsWithES6

 console.log( /* !(not)endsWith */ !"foo.html".endsWith("foo.htm"), // true !"barfoo.htm".endsWith("foo.htm"), // false (here you go) !"foo.htm".endsWith("foo.htm"), // false (here you go) !"test.html".endsWith("foo.htm"), // true !"test.htm".endsWith("foo.htm") // true ); 

你可以用类似/(.|..|.*[^f]..|.*f[^o].|.*fo[^o])\.htm$/来模拟负面/(.|..|.*[^f]..|.*f[^o].|.*fo[^o])\.htm$/ ,但是程序化方法会更好。