以正则表达式匹配任意不以 .js 结尾的字符串。

10

这让我非常困扰。我正在尝试匹配所有不以.js结尾的内容。我正在使用perl,所以欢迎使用?<!等语法。

我想要做什么:

要匹配这些内容

mainfile
jquery.1.1.11
my.module

请勿匹配以下内容

mainfile.js
jquery.1.1.11.js
my.module.js

这应该是一个非常简单的任务,但我却被卡住了。我查看了regexsedperl的文档,并在regexr上瞎搞了半个小时。直觉告诉我这个例子/^.*?(?!\.js)$/)应该可以完成任务。我想我可能只是盯着代码看太久了。

提前感谢。

3个回答

13

您可以使用此正则表达式来确保匹配不以.js结尾:

^(?!.+\.js$).+$

正则表达式演示

(?!.+\.js$)是一个负向先行断言条件,如果一行以.js结尾,则匹配失败。


1
^(.(?!\.html$))*$ 如果你也想匹配空字符串。 - Yves M.

2
这个正则表达式可以满足你的需求: ^.*(?<![.]js)$ 它与所有不以“.js”结尾的字符串匹配。

2
@anubhava 这个问题是关于Perl的,不是JavaScript。 - Paul

1
当您只有负匹配条件时,最简单的方法是构建一个正则表达式,并检查它是否不匹配。
if ($string !~ /\.js$/)
{
   print "Doesn't end in .js";
}

这比负向先行断言更易理解和高效。 只有在需要混合正面和负面条件时才需要使用先行断言(例如,“我需要从字符串中匹配“foo”,但仅当它后面没有“bar”时)。即使如此,有时使用多个简单模式和逻辑比使用一个复杂模式满足所有要求更容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接