Regex 所有文件都以后缀结尾,但不使用否定

Regex 所有文件都以后缀结尾,但不使用否定,regex,regex-negation,Regex,Regex Negation,我正在尝试匹配所有文件,但以.bmp结尾的文件除外 由于一些限制,我不能使用否定(?,!:)和引用(\1,…) 我制作了一个表达式,它适用于大多数字符串: ^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$ 它匹配所有不以.bmp结尾的内容,包括test.txt、test.bmp.txt等。 但实际上,它确实允许test.bi.bmp 关于如何改进正则表达式,使其只匹配文件而不是以.bmp结尾的文件,您有什么想法吗?不太优雅,但可以工作: ^.*([^b][

我正在尝试匹配所有文件,但以.bmp结尾的文件除外

由于一些限制,我不能使用否定(?,!:)和引用(\1,…)

我制作了一个表达式,它适用于大多数字符串:

^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$
它匹配所有不以.bmp结尾的内容,包括test.txt、test.bmp.txt等。 但实际上,它确实允许test.bi.bmp


关于如何改进正则表达式,使其只匹配文件而不是以.bmp结尾的文件,您有什么想法吗?

不太优雅,但可以工作:

^.*([^b][^m][^p]|b[^m][^p]|[^b]m[^p]|[^b][^m]p|bm[^p]|[^b]mp)$
为什么不:

^.*[^p]$|^.*[^m]p$|^.*[^b]mp$|^.*[^.]bmp$
?

一个是
^.*([^p][^m]p.[^b]mp.[^.]bmp)$
(更短)


出于好奇,只需确保“bmp”之前的点是最后一个点,这些限制是什么?目标机器上还有其他应用程序使用regex引擎,这是由于某些原因(我不完全清楚,但我猜可能与性能、与某物的兼容性或速度有关)正则表达式引擎是在没有它的情况下专门编译的…:-(您还假设扩展名总是3个字母长。我不这么认为,我只是假设.bmp是3个字母长。超过3个字符的扩展名也会匹配。@Dmitry:例如test.notabmp?这应该由您的正则表达式匹配,但我不认为是。test.bsp也不匹配…可能是b[^m]p应该添加到OR子句中?它仍然匹配任何东西。bmp…我认为这是因为*is greedy不[^.]只是否定一切?@Daniel:不,正则表达式元字符在字符类中失去了特殊意义。我以为它只适用于()…很高兴知道!谢谢。最后一个问题-测试..bmp通过了。谢谢,它工作得很完美(比我写的要优雅得多)。尽管最后一个错误的文件名通过了表达式:test。。bmp@Daniel:当文本位于最后一个输入行,后面是一个空行时,regexr中的regexp有一个错误。我不知道为什么。在那一行之后打开一个新行,键入任何其他内容,然后查看。谢谢。它完全解决了我的问题,我学到了很多哦,你的回答!
/^.+\.([^b][^.]*|b|b[^m][^.]*|bm|bm[^p][^.]*|bmp[^.]+)$/