需要正则表达式来排除某些字符串

The*_*edi 8 regex

我正在尝试获得匹配的正则表达式:

somefile_1.txt
somefile_2.txt
somefile_{anything}.txt
Run Code Online (Sandbox Code Playgroud)

但不匹配:

somefile_16.txt
Run Code Online (Sandbox Code Playgroud)

我试过了

somefile_[^(16)].txt
Run Code Online (Sandbox Code Playgroud)

没有运气(甚至包括"16"记录)

phi*_*hag 11

一些正则表达式库允许前瞻:

somefile(?!16\.txt$).*?\.txt
Run Code Online (Sandbox Code Playgroud)

否则,您仍然可以使用多个字符类:

somefile([^1].|1[^6]|.|.{3,})\.txt
Run Code Online (Sandbox Code Playgroud)

或者,为了实现最大的便携性:

somefile([^1].|1[^6]|.|....*)\.txt
Run Code Online (Sandbox Code Playgroud)

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


Dou*_*yle 5

已经提到了最好的解决方案:

somefile_(?!16\.txt$).*\.txt
Run Code Online (Sandbox Code Playgroud)

这是有效的,并且足够贪婪,可以在同一条线上接收任何东西.但是,如果你知道你想要一个有效的文件名,我建议你也限制无效字符:

somefile_(?!16)[^?%*:|"<>]*\.txt
Run Code Online (Sandbox Code Playgroud)

如果你正在使用一个不支持前瞻的正则表达式引擎,你将不得不考虑如何弥补它!16.您可以将文件拆分为两组,一组以1开头,后面跟不是6,以及以其他方式开头的组:

somefile_(1[^6]|[^1]).*\.txt
Run Code Online (Sandbox Code Playgroud)

如果你想允许somefile_16_stuff.txt而不是somefile_16.txt,那么上面的这些正则表达式是不够的.您需要以不同方式设置限制:

somefile_(16.|1[^6]|[^1]).*\.txt
Run Code Online (Sandbox Code Playgroud)

综合这一切,最终会有两种可能性,一种阻塞单个实例(somefile_16.txt),另一种阻塞所有系列(somefile_16*.txt).我个人认为你更喜欢第一个:

somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
Run Code Online (Sandbox Code Playgroud)

在没有删除特殊字符的版本中,因此更容易阅读:

somefile_((16.|1[^6]|[^1).*|1)\.txt
somefile_((1[^6]|[^1]).*|1)\.txt
Run Code Online (Sandbox Code Playgroud)