已经提出了类似的问题,但他们错过了我需要做的一件事,我无法弄清楚。
我需要找到所有没有tif或tiff扩展名的文件,但我需要找到所有其他文件,包括那些没有扩展名的文件。我得到了第一部分使用下面的正则表达式,但这并没有匹配没有扩展名的文件。
^(.+)\.(?!tif$|tiff$).+$
这很有效,但我需要以下工作。
filename.ext MATCH
filename.abc MATCH
filename.tif FAIL
filename MATCH
谢谢:)
答案 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'
截图:
答案 4 :(得分:0)
以下是我提出的建议:
^[^\.\s]+(\.|\s)(?!tiff?)
说明:
从行到点或空格的开头,将匹配的组放在此周围,即:
^(?<result>[^\.\s]+)
然后它将寻找一个点或一个空格,在tiff上有一个负向前瞻(tiff?将匹配tif和tiff)。
这假设文件名后面总会有一个点或一个空格。如果您需要,可以将其更改为行尾:
^[^\.\s]+(\.(?!tiff?)|\n) linux
^[^\.\s]+(\.(?!tiff?)|\r\n) windows