2008-11-24 79 views

回答

11

一些正則表達式庫a llow前瞻:

somefile(?!16\.txt$).*?\.txt 

否則,你仍然可以使用多個字符類:

somefile([^1].|1[^6]|.|.{3,})\.txt 

,或者達到最大的可移植性:

somefile([^1].|1[^6]|.|....*)\.txt 

[^(16)]表示:匹配任何字符,但括號, 1和6.

+0

你可能想要一個?在這裏像這樣: somefile(?!16)。*?\。txt – 2008-11-24 16:43:55

+0

@Martin Brown:爲什麼? 。*?在大多數方言中afaik無效。 。指任何字符,*零次或多次出現。問號應該做什麼? – phihag 2008-11-24 16:45:56

3
somefile_(?!16).*\.txt 

(?!16)表示:聲明無法匹配從該位置開始的正則表達式「16」。

5

最好的解決方案已經提到:

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 
4

要嚴格遵守您的具體要求和挑剔,你應該寧願使用:

^somefile_(?!16\.txt$).*\.txt$ 

使得somefile_1666.txt,它是{}任何可匹配;)

但有時它只是更易於使用...:

ls | grep -e 'somefile_.*\.txt' | grep -v -e 'somefile_16\.txt' 
2

有時使用兩個正則表達式會更容易。首先尋找你想要的一切,然後忽略你不需要的一切。我一直在命令行上執行此操作,我在其中傳遞一個正則表達式,將超集合導入另一個正則表達式,忽略我不想要的東西。

如果目標是完成工作而不是找到完美的正則表達式,請考慮該方法。編寫和理解比使用外來特徵的正則表達式要容易得多。

1

不使用先行

somefile_(|.|[^1].+|10|11|12|13|14|15|17|18|19|.{3,}).txt 

讀它喜歡:somefile_後接:

  1. 什麼。
  2. 單個字符。
  3. 1之外的任何一個字符,以及其後的任何其他字符。
  4. 三個或更多字符。
  5. 要麼10 .. 19請注意,16已被省略。

並且最後跟着.txt

相關問題