【问题标题】:RegExp-filtering particular file path using directory and file extension blacklistingRegExp-使用目录和文件扩展名黑名单过滤特定文件路径
【发布时间】:2014-07-28 15:30:45
【问题描述】:

我有示例路径:

/var/ftp/video/Portuguese/Portuguese-Daniel/Animação Inicial/CLIPS/Torsten.Sturmwellen.Veith/Wellen_00653.tif

我需要将/var/ftp/video/English目录以及一些文件扩展名(如doc/docx/ppt/pptx/tif/tiff/pdf/jpg/DS_Store)列入黑名单

我使用的正则表达式是:

^(?!\/var\/ftp\/video\/English)(.*\.(?!doc.*$|ppt.*$|jpg.*$|tif.*$|pdf.*$|DS_Store.*$)[^.]+)

但它不起作用,因为它匹配这个示例路径(但没有扩展名)。 为了进行测试,我使用http://regex101.com/ 站点。

我的 RegExp 有什么问题?

【问题讨论】:

  • 你为什么在最后添加[^.]+(即在$之后)?
  • 如果文件路径有效则捕获扩展名(未应用黑名单)
  • 在这个扩展之后是否有可能的 GET 变量.ext?var1=value1&var2=value2... 或路径.ext/dir1/dir2?你会使用什么语言?
  • 为什么每次分机后都加.*?如果它们是扩展(并且没有 GET 变量),它不应该是路径的结尾吗?还有,为什么.*+doc 之后?
  • 因为它可能不仅是 doc,也可能是 docx。抱歉,已将 .*+ 更改为 .* 但这并不能解决问题。

标签: regex filtering filepath negative-lookahead


【解决方案1】:

表达式

(.*\.(?!doc.*$|ppt.*$|jpg.*$|tif.*$|pdf.*$|DS_Store.*$)[^.]+)

明确排除扩展名。这就是为什么你的表达不起作用的原因。

表达式

(.*\.(?!doc.*$|ppt.*$|jpg.*$|tif.*$|pdf.*$|DS_Store.*$).*)

包括扩展名。

用这个 perl 代码测试:

$a="/var/ftp/video/Portuguese/Portuguese-Daniel/Animação Inicial/CLIPS/Torsten.Sturmwellen.Veith/Wellen_00653.tif";

if ($a=~/^(?!\/var\/ftp\/video\/English)(.*\.(?!doc.*$|ppt.*$|jpg.*$|tif.*$|pdf.*$|DS_Store.*$).*+)/) {
print "$1\n";}

结果:

/var/ftp/video/Portuguese/Portuguese-Daniel/Animação Inicial/CLIPS/Torsten.Sturmwellen.Veith/Wellen_00653.tif 

【讨论】:

  • 谢谢,但我想将 TIFF 列入黑名单。它不应该返回任何匹配项。
  • 好的。那么你需要使用向后看 (?
【解决方案2】:

找到解决方案:

^(?!\/var\/ftp\/video\/English)(.*\.(?!(doc.?|ppt.?|jpg|tif.?|pdf|DS_Store)$)([^.]+$))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2014-06-06
    • 2020-11-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多