我試圖讓一個正則表達式將匹配:需要一個正則表達式來排除某些字符串
somefile_1.txt
somefile_2.txt
somefile_{anything}.txt
但不匹配:
somefile_16.txt
我試圖
somefile_[^(16)].txt
與沒有運氣(它甚至包括「16」記錄)
我試圖讓一個正則表達式將匹配:需要一個正則表達式來排除某些字符串
somefile_1.txt
somefile_2.txt
somefile_{anything}.txt
但不匹配:
somefile_16.txt
我試圖
somefile_[^(16)].txt
與沒有運氣(它甚至包括「16」記錄)
一些正則表達式庫a llow前瞻:
somefile(?!16\.txt$).*?\.txt
否則,你仍然可以使用多個字符類:
somefile([^1].|1[^6]|.|.{3,})\.txt
,或者達到最大的可移植性:
somefile([^1].|1[^6]|.|....*)\.txt
[^(16)]
表示:匹配任何字符,但括號, 1和6.
somefile_(?!16).*\.txt
(?!16)表示:聲明無法匹配從該位置開始的正則表達式「16」。
最好的解決方案已經提到:
somefile_(?!16\.txt$).*\.txt
這工作,並且是貪心不足採取任何東西它即將在同一行。如果你知道的,但是,你想有一個有效的文件名,我也建議限制無效字符:
somefile_(?!16)[^?%*:|"<>]*\.txt
如果您使用的是不支持前瞻正則表達式引擎的工作,你就必須考慮如何彌補這一點!16。你可以分割文件分成兩組,那些從1開始,而不是後面6,和那些與別的開始:
somefile_(1[^6]|[^1]).*\.txt
如果你想允許somefile_16_stuff.txt但不是somefile_16.txt ,這些正則表達式是不夠的。你需要設置不同的限制:
somefile_(16.|1[^6]|[^1]).*\.txt
都結合這一點,你結束了兩種可能,一是阻斷了單一實例(somefile_16.txt),和一個阻斷了所有的家庭( somefile_16 * .TXT)。我個人認爲你喜歡的第一個:
somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
在版本不去除特殊字符,以便更容易閱讀:
somefile_((16.|1[^6]|[^1).*|1)\.txt
somefile_((1[^6]|[^1]).*|1)\.txt
要嚴格遵守您的具體要求和挑剔,你應該寧願使用:
^somefile_(?!16\.txt$).*\.txt$
使得somefile_1666.txt,它是{}任何可匹配;)
但有時它只是更易於使用...:
ls | grep -e 'somefile_.*\.txt' | grep -v -e 'somefile_16\.txt'
有時使用兩個正則表達式會更容易。首先尋找你想要的一切,然後忽略你不需要的一切。我一直在命令行上執行此操作,我在其中傳遞一個正則表達式,將超集合導入另一個正則表達式,忽略我不想要的東西。
如果目標是完成工作而不是找到完美的正則表達式,請考慮該方法。編寫和理解比使用外來特徵的正則表達式要容易得多。
不使用先行
somefile_(|.|[^1].+|10|11|12|13|14|15|17|18|19|.{3,}).txt
讀它喜歡:somefile_
後接:
1
之外的任何一個字符,以及其後的任何其他字符。10
.. 19
請注意,16
已被省略。並且最後跟着.txt
。
你可能想要一個?在這裏像這樣: somefile(?!16)。*?\。txt – 2008-11-24 16:43:55
@Martin Brown:爲什麼? 。*?在大多數方言中afaik無效。 。指任何字符,*零次或多次出現。問號應該做什麼? – phihag 2008-11-24 16:45:56