有一个perl脚本需要处理给定目录中某种类型的所有文件。文件应该是以.jup结尾的文件,并且文件名中不应包含单词“TEMP_”。 I.E.它应该允许corre.jup,但不允许TEMP_corrected.jup。
尝试过预测,但显然模式不正确:
/(?!TEMP_).*\.jup$/
这将返回整个目录内容,包括具有任何扩展名的文件和包含TEMP_的文件,例如文件TEMP_corrected.jup。
答案 0 :(得分:2)
您想要的正则表达式是:
/^((?!TEMP_).)*\.jup$/
主要区别在于您的正则表达式没有锚定在字符串的开头,因此它匹配满足您的条件的任何子字符串 - 所以在TEMP_corrected.jup
的示例中,子字符串corrected.jup
和EMP_corrected.jup
都匹配。
(另一个区别是将()
围绕前瞻和.
确保在字符串中的任何位置都不允许TEMP_,而不是在开始时不允许。不确定是否这对你重要或不重要!)
如果您获取的文件不是.jup
,那么还有另一个问题 - 您的表达式应该只匹配.jup
个文件。您可以使用以下方法测试您的表达式:
perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}'
然后键入字符串:perl会在它们匹配时回显它们,如果它们不匹配则不会。例如:
$ perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}'
foo
foo.jup
foo.jup <-- perl printed this because 'foo.jup' matched
TEMP_foo.jup