正则表达式排除某些文件扩展名

时间:2017-04-19 15:04:18

标签: regex

已经提出了类似的问题,但他们错过了我需要做的一件事,我无法弄清楚。

我需要找到所有没有tif或tiff扩展名的文件,但我需要找到所有其他文件,包括那些没有扩展名的文件。我得到了第一部分使用下面的正则表达式,但这并没有匹配没有扩展名的文件。

^(.+)\.(?!tif$|tiff$).+$

这很有效,但我需要以下工作。

filename.ext MATCH
filename.abc MATCH
filename.tif FAIL
filename     MATCH

谢谢:)

5 个答案:

答案 0 :(得分:1)

如果您不使用JS / ECMAscript正则表达式,可以使用:

^.*(?<!\.tif)(?<!\.tiff)$

答案 1 :(得分:0)

这对我有用:

^(?:(.+\.)((?!tif$|tiff$)[^.]*)|[^.]+)$

正则表达式分为两个不同的部分:

第1部分: (.+)\.((?!tif$|tiff$)[^.]*)

  • (.+) (第一个捕获组)匹配文件名(可能包含点)
  • \.匹配字符串的最后一个点(在扩展名之前)。
  • ((?!tif$|tiff$)[^.]*) (第二个捕获组)然后检查点是不是,然后是完全&#34; TIF &#34;或&#34; tiff &#34;如果匹配,则延伸。

第2部分: [^.]+如果第1部分不匹配,请检查您是否只有不包含点的文件名。

答案 2 :(得分:0)

不要编写负正则表达式,而应考虑使用更简单,正面的正则表达式,但在匹配时执行操作。这通常是一种很好的方法。

它不能在任何情况下使用(例如,如果您使用的命令行工具要求您指定 匹配的内容),但我会尽可能地这样做。

答案 3 :(得分:0)

如果文字文件中有一些字符串(有换行符)

perl -lne '/(?:tiff?)/ || print' file  

如果目录中有一些文件:

ls | perl -lne '/(?:tiff?)/ || print'  

截图:

enter image description here

答案 4 :(得分:0)

以下是我提出的建议:

^[^\.\s]+(\.|\s)(?!tiff?)

说明:

从行到点或空格的开头,将匹配的组放在此周围,即:

^(?<result>[^\.\s]+)

然后它将寻找一个点或一个空格,在tiff上有一个负向前瞻(tiff?将匹配tif和tiff)。

这假设文件名后面总会有一个点或一个空格。如果您需要,可以将其更改为行尾:

^[^\.\s]+(\.(?!tiff?)|\n)   linux
^[^\.\s]+(\.(?!tiff?)|\r\n) windows