我正在尝试编写一个非常简单的正则表达式,它匹配任何不以.php结尾的文件名。我想出了以下内容......
(.*?)(?!\.php)$
...但是这匹配所有文件名。如果有人能指出我正确的方向,我将非常感激。
答案 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断言。