我正在尝试获得匹配的正则表达式:
somefile_1.txt somefile_2.txt somefile_{anything}.txt
但不匹配:
somefile_16.txt
我试过了
somefile_[^(16)].txt
没有运气(甚至包括"16"记录)
一些正则表达式库允许前瞻:
somefile(?!16\.txt$).*?\.txt
否则,您仍然可以使用多个字符类:
somefile([^1].|1[^6]|.|.{3,})\.txt
或者,为了实现最大的便携性:
somefile([^1].|1[^6]|.|....*)\.txt
[^(16)]
表示:匹配任何字符,但是大括号,1和6.
已经提到了最好的解决方案:
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