Regex 如何为以.php结尾的文件创建正则表达式?

Regex 如何为以.php结尾的文件创建正则表达式?,regex,regex-negation,regex-lookarounds,Regex,Regex Negation,Regex Lookarounds,我正在尝试编写一个非常简单的正则表达式,它匹配任何不以.php结尾的文件名。我得出了以下结论 (.*?)(?!\.php)$ …但是,这将匹配所有文件名。如果有人能给我指出正确的方向,我将不胜感激。你站在了终点,向前看。您需要的是向后看一看: (.*)$(? 请注意,并非所有正则表达式引擎都支持lookbehind断言。有时在宿主语言级别的regex之外使用否定比使用否定更容易。在许多语言中,布尔补码运算符是一元! 所以你可以这样写: ! str.hasMatch(/\.php$/) 根据语

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

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

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

你站在了终点,向前看。您需要的是向后看一看:

(.*)$(?

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

有时在宿主语言级别的regex之外使用否定比使用否定更容易。在许多语言中,
布尔
补码运算符是一元

所以你可以这样写:

! str.hasMatch(/\.php$/)
根据语言的不同,您还可以完全跳过正则表达式,并使用类似(例如Java)的内容:

至于原始图案本身的问题:

(.*?)(?!\.php)$   // original pattern, doesn't work!
这匹配,比如说,
file.php
,因为
(.*?
可以捕获
file.php
,向前看,你不能匹配
\.php
,但是你可以匹配
$
,所以总的来说,这是一个匹配!你可以使用lookbehind,或者如果它不受支持,你可以在字符串的开头向前看

^(?!.*\.php$).*$  // negative lookahead, works
这将使用负前瞻匹配所有不以
“.php”
结尾的字符串

工具书类
相关问题
几乎:

.*(?!\.php)....$
检查“向前看”时,最后四个点确保有东西要向前看

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


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

什么语言?每种语言的RegEx实现都不同,因此了解-php?perl?python?java?javascript?.net很重要-正则表达式是用php编写的吗?实现语言是什么UAGE非常重要。你从来没有投票给任何人回答你的问题的答案,你也不接受其中一个。考虑这样做:这几乎就是这样的精神。Bart,我实际上很清楚这一点,但是坦率地说,我认为我以前的任何问题都没有答案,这是有帮助的。对于其他代理来说,该语言实际上是针对Apache的(ProxyPasMatch)。好吧,这很公平。虽然您的第一个问题(以及您对其中某个答案的评论)似乎与您的评论相矛盾。非常感谢Tomalak,这对以后查看此内容的任何人都非常有效,但我们使用的最终代码是ProxyPassMatch^(.*)\(?!php)…)*$Minor pedant:这将不匹配文件名长度小于4个字符的文件。ProxyPassMatch^(.*。(!php)。*)$-是我们用于将来参考的最终版本,它还修复了文件名长度问题(使用文件名i.php测试)@Mark Byers:你是对的,我没有想到这种情况。正确的应该是
^(.{1,3}|*(?!\.php)…)$
。一个更具体的示例模式,分别捕获前缀部分和扩展部分。-有很大的改进空间,但这需要更精确的规范。谢谢poly,我应该在我的OP中提到这是针对Apache代理的。通常我会在代码中进行否定,但显然我们没有本例中的选项。无论如何感谢您的回复。我知道您只是从OP的正则表达式中复制了它,但是这个不情愿的量词没有任何意义。您强制正则表达式为字符串中的每个字符计算一次lookback,而您知道它只需要在末尾应用。事实上,我会将lookback放在乔:
*$(?@Alan Moore:是的,关于在锚点之后放置先行的性能,您可能是对的。尽管我不确定在某些正则表达式引擎中,
$
锚点是否会使用尾随的新行字符,这将产生不同的结果。但在Apache中解析URL时,这可能不会成为问题。
^(?!.*\.php$).*$  // negative lookahead, works
.*(?!\.php)....$