2010-06-28 68 views
0

有一個perl腳本,需要處理給定目錄中某個類型的所有文件。這些文件應該是那些以.jup結尾的文件,而且不應該在文件名中包含「TEMP_」這個詞。 I.E.它應該允許correct.jup,但不允許TEMP_corrected.jup。需要特定的Perl正則表達式

已經嘗試了前瞻,但顯然有不正確模式:

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

這雖然返回整個目錄的內容,包括與任何擴展名的文件和那些含有TEMP_,如文件TEMP_corrected.jup 。

回答

2

你想要的正則表達式爲:

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

的主要區別是,你的正則表達式不是在字符串的開頭固定,所以它匹配滿足你的標準的任何子 - 在這個例子,的TEMP_corrected.jup,子串corrected.jupEMP_corrected.jup都匹配。

(另一個區別是,將()放在向前和.的圓周上可以確保TEMP_不會在字符串的任何位置被允許使用,而不僅僅是在一開始就不允許使用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 
+0

是的,非常感謝您的回答和解釋! – 2010-06-28 20:12:22