是否有更短的方式来编写此RegEx?

时间:2013-10-11 09:35:47

标签: regex regex-negation

我有一个正则表达式,查看文件的文件扩展名是否不是给定的扩展名之一。有没有办法我可以写这个而不必把它。在每个扩展名面前?

^.*(?<!\.php|\.html|\.xml|\.js|\.css|\.bmp|\.ico|\.jpg|\.jpeg|\.png|\.gif|\.rss)$

2 个答案:

答案 0 :(得分:2)

是的,你可以使用:

^.*(?<!\.(?:php|html|xml|js|css|bmp|ico|jpe?g|png|gif|.rss)$)$

将点移到组外,因为它对所有扩展名都是通用的,而jpg|jpeg可以写为jpe?g

答案 1 :(得分:2)

是的,您可以使用非捕获组:

^.*(?<!\.(?:php|html|xml|js|css|bmp|ico|jpg|jpeg|png|gif|rss)$)$

虽然使用某些角色类也很好,但也许是这样的:

^.*(?<!\.(?:(?:ht|x)ml|j(?:pg|s|peg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)$)$

这减少了处理时间。虽然这些并不完全正常,因为在PHP中,lookbehinds必须是固定的宽度,因此,我建议使用如下的否定前瞻:

^(?!.*\.(?:(?:ht|x)ml|j(?:peg|s|pg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)$).*$

初始正则表达式使120 steps匹配,但只有35 steps与最后一个正则表达式中应用的更改匹配。

但是,如果您想匹配.phpx等扩展程序,可以使用此功能:

^(?!.*\.(?:(?:ht|x)ml|j(?:peg|s|pg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)).*$