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

mat*_*boy 0 java regex regex-negation

在 Java 应用程序中,我需要编写一个String包含 URI 的正则表达式,以便 URI 不包含像.js?,.css?和之类的字符序列.jpg?,但也不以.js,.css和结尾.jpg

我做了以下事情:

(?:.js|.css|.jpg)$|(?:.js[?]|.html[?]|.jpg[?])
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能对前面的条件进行否定?

例如,我希望以下 URI 将匹配

"/a/fancy/uri/.js/which/is/valid"
Run Code Online (Sandbox Code Playgroud)

但以下两者都不会

"/a/fancy/uri/which/is/invalid.js"
"/a/fancy/uri/which/is/invalid.js?ver=1"
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

在否定前瞻中使用两个交替:

^(?!.*\.(js|css|jpg)($|\?)).*
Run Code Online (Sandbox Code Playgroud)

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

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

如果要匹配无效输入,请使用正向前瞻:

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