0

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

已经尝试过前瞻,但显然模式不正确:

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

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

4

1 回答 1

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
于 2010-06-28T20:06:18.793 回答