如何为以.php结尾的文件制作正则表达式?

时间:2010-08-04 09:03:26

标签: regex regex-negation regex-lookarounds

我正在尝试编写一个非常简单的正则表达式,它匹配任何不以.php结尾的文件名。我想出了以下内容......

(.*?)(?!\.php)$

...但是这匹配所有文件名。如果有人能指出我正确的方向,我将非常感激。

3 个答案:

答案 0 :(得分:6)

几乎:

.*(?!\.php)....$

当检查前瞻时,最后四个点确保有东西可以向前看

由于您对整场比赛感兴趣,因此不需要外括号。

不情愿的.*?是不必要的,因为回溯四个步骤比每一步检查以下条件更有效。

答案 1 :(得分:4)

有时在主机语言级别使用正则表达式之外的否定更容易,而不是使用否定前瞻。在许多语言中,boolean补语运算符是一元!

所以你可以这样写:

! str.hasMatch(/\.php$/)

根据语言的不同,您也可以完全跳过正则表达式并使用类似的东西(例如Java):

! str.endsWith(".php")

至于原始模式本身的问题:

(.*?)(?!\.php)$   // original pattern, doesn't work!

这与file.php匹配,因为(.*?)可以抓取file.php,并且提前 ,但您无法匹配\.php ,但你可以匹配$,所以总的来说它是一个匹配!您可能希望使用后面的,或者如果它不受支持,您可以查看字符串的 start

^(?!.*\.php$).*$  // negative lookahead, works

这将使用负前瞻匹配所有不以".php"结尾的字符串。

参考

相关问题

答案 2 :(得分:3)

您在字符串的末尾并且正在查看提前。您想要的是背后的

(.*)$(?<!\.php)

请注意,并非所有正则表达式引擎都支持lookbehind断言。