2

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

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

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

4

3 回答 3

6

几乎:

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

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

外括号是不必要的,因为您对整个匹配感兴趣。

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

于 2010-08-04T09:25:19.487 回答
4

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

所以你可以这样写:

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

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

! str.endsWith(".php")

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

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

这匹配,说,,file.php因为(.*?)可以捕获file.php向前看,你不能匹配\.php,但是你可以匹配一个$,所以总的来说它是匹配的!您可能想要使用 look behind,或者如果它不受支持,您可以在字符串的开头前瞻。

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

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

参考

相关问题

于 2010-08-04T09:13:29.923 回答
3

你在字符串的末尾并向前看。你想要的是向后看

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

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

于 2010-08-04T09:12:28.757 回答