2008-11-24 77 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

相关问题