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