Regex 需要特定的Perl正则表达式

Regex 需要特定的Perl正则表达式,regex,perl,negative-lookahead,Regex,Perl,Negative Lookahead,有一个perl脚本,需要处理给定目录中特定类型的所有文件。这些文件应该是以.jup结尾的文件,并且文件名中不应该包含单词“TEMP”。也就是说,它应该允许更正的.jup,但不允许临时更正的.jup 已尝试进行前瞻,但模式显然不正确: /(?!TEMP_).*\.jup$/ 但这将返回整个目录内容,包括具有任何扩展名的文件和包含TEMP_的文件,例如文件TEMP_corrected.jup。您需要的正则表达式是: /^((?!TEMP_).)*\.jup$/ 主要区别在于正则表达式没有锚定在字

有一个perl脚本,需要处理给定目录中特定类型的所有文件。这些文件应该是以.jup结尾的文件,并且文件名中不应该包含单词“TEMP”。也就是说,它应该允许更正的.jup,但不允许临时更正的.jup

已尝试进行前瞻,但模式显然不正确:

/(?!TEMP_).*\.jup$/

但这将返回整个目录内容,包括具有任何扩展名的文件和包含TEMP_的文件,例如文件TEMP_corrected.jup。

您需要的正则表达式是:

/^((?!TEMP_).)*\.jup$/
主要区别在于正则表达式没有锚定在字符串的开头,因此它匹配满足条件的任何子字符串-因此在
TEMP_corrected.jup
的示例中,子字符串
corrected.jup
EMP_corrected.jup
都匹配

(另一个区别是将
()
四舍五入向前看和
确保字符串中的任何位置都不允许临时值,而不仅仅是在开始时。不确定这对您是否重要!)

如果您获取的文件不是
.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
$perl-ne'if(/^((?!TEMP.)*\.jup$/){print;}
福
foo.jup
foo.jup