用于匹配未结束或包含文件扩展名的字符串的正则表达式

Regex for matching string not ending or containing file extensions

在 Java 应用程序中,我需要编写一个包含 URI 正则表达式的 String,以便 URI 不包含 .js?、[=15= 等字符序列] 和 .jpg?,但也不以 .js.css.jpg

结尾

我做了以下内容:

(?:.js|.css|.jpg)$|(?:.js[?]|.html[?]|.jpg[?])

基本上匹配所有以给定文件扩展名结尾或包含文件扩展名加问号的URI。

如何对前面的条件求反?

因此,例如我希望以下 URI 匹配

"/a/fancy/uri/.js/which/is/valid"

但以下两者都不会

"/a/fancy/uri/which/is/invalid.js"
"/a/fancy/uri/which/is/invalid.js?ver=1"

如果您尝试匹配无效的 URL,应该这样做:

String regex = ".*\.(js|css|jpg)($|\?.*)";
System.out.println("/a/fancy/uri/which/is/invalid.js?ver=1".matches(regex));
System.out.println("/a/fancy/uri/which/is/invalid.js".matches(regex));
System.out.println("/a/fancy/uri/.js/which/is/valid".matches(regex));

输出:

true
true
false

在负面展望中使用两个交替:

^(?!.*\.(js|css|jpg)($|\?)).*

此正则表达式匹配 有效 输入。在 java:

if (url.matches("^(?!.*\.(js|css|jpg)($|\?)).*")
    // url is OK

如果要匹配无效的输入,使用正向预测:

if (url.matches("^(?=.*\.(js|css|jpg)($|\?)).*")
    // url is not OK