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

Posted

技术标签:

【中文标题】匹配字符串的正则表达式不结束或不包含文件扩展名【英文标题】:Regex for matching string not ending or containing file extensions 【发布时间】:2016-12-24 17:42:42 【问题描述】:

在 Java 应用程序中,我需要编写一个包含 URI 正则表达式的 String,以便 URI 不包含像 .js?.css?.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 还是有效的 URL? 你应该使用URI类提取之前的路径:download.java.net/jdk7/archive/b123/docs/api/java/net/URI.html @CasimiretHippolyte 我不能。请参阅我对已接受答案的评论。我在 Spring 注释中使用它来过滤占位符。 投反对票的人,下次花两秒钟解释原因! 【参考方案1】:

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

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

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

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

如果你想匹配 invalid 输入,使用正向向前看:

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

【讨论】:

完美!我将它与answer 结合使用,了解如何在 Spring 控制器中使用占位符【参考方案2】:

如果您尝试匹配无效的 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

【讨论】:

我想匹配 url 是否有效,例如不能以 .css 结尾或不能包含 .css?

以上是关于匹配字符串的正则表达式不结束或不包含文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 匹配任何单词但忽略特定单词[重复]

用于匹配包含或不包含http的URL的正则表达式

grep命令

C# 正则表达式

notepad++正则表达式

正则表达式匹配路径