我有一个正则表达式,查看文件的文件扩展名是否不是给定的扩展名之一。有没有办法我可以写这个而不必把它。在每个扩展名面前?
^.*(?<!\.php|\.html|\.xml|\.js|\.css|\.bmp|\.ico|\.jpg|\.jpeg|\.png|\.gif|\.rss)$
答案 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)).*$