我正在尝试获得匹配的正则表达式:
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.
已经提到了最好的解决方案:
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)
| 归档时间: |
|
| 查看次数: |
36435 次 |
| 最近记录: |