需要特定的Perl正则表达式

时间:2010-06-28 19:57:19

标签: regex perl negative-lookahead

有一个perl脚本需要处理给定目录中某种类型的所有文件。文件应该是以.jup结尾的文件,并且文件名中不应包含单词“TEMP_”。 I.E.它应该允许corre.jup,但不允许TEMP_corrected.jup。

尝试过预测,但显然模式不正确:

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

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

1 个答案:

答案 0 :(得分:2)

您想要的正则表达式是:

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

主要区别在于您的正则表达式没有锚定在字符串的开头,因此它匹配满足您的条件的任何子字符串 - 所以在TEMP_corrected.jup的示例中,子字符串corrected.jupEMP_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