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