我试图让一个正则表达式将匹配:需要一个正则表达式来排除某些字符串
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