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

时间:2016-08-17 22:31:40

标签: java regex regex-negation

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

结尾

我做了以下事情:

.jpg

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

我如何否定以前的条件?

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

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

但以下两者都不会

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

如果您想匹配无效的输入,请使用正面的预测:

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

答案 1 :(得分:1)

如果您尝试匹配无效网址,则应执行以下操作:

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