【问题标题】: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 注释中使用它来过滤占位符。
  • 投反对票的人,下次花两秒钟解释原因!

标签: java regex regex-negation


【解决方案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?
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2017-07-22
  • 2013-09-02
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
相关资源
最近更新 更多