正则表达式不匹配,为什么?

时间:2014-04-20 12:17:07

标签: regex

我希望匹配以下所有路径:

不要以" / foo-bar /"

开头

或不以任何扩展名结尾(.jpg,.gif等)

的示例:

/foo-bar/aaaa/fff will not match

/foo-bar/aaaa/fff.jpg will not match

/aaa/bbb will match

/aaaa/bbbb.jpg will not match

/bbb.a will not match

这是我的正则表达式:

^\/(?!foo-bar\/).*(?!\.).*$

但是没有用,为什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试匹配您不想要的内容会更容易。 PHP示例:

if (!preg_match('~^/foo-bar/|\.[^/]+$~', $url))
    echo 'Valid!';

由于此部分.*(?!\.).*$,您的模式无法正常工作。第一个.*是贪婪的,并且将字符串的所有字符都带到结尾,之后,为了使模式的结束成功,正则表达式引擎将回溯一个字符(字符串的最后一个)。如果不是点,则(?!\.).*$将始终匹配最后一个字符。

如果您绝对需要肯定模式,可以使用:

if (preg_match('~^/(?!foo-bar/)(?:[^/]*/)*+[^./]*$~', $url))
    echo 'Valid!';

答案 1 :(得分:0)

你可以尝试这个,这有点简单,接近你所尝试的:

^(?!\/foo-bar)([^\.]+)$

Live Demo