用于匹配以模式开头但不以模式结尾的字符串的正则表达式

时间:2013-04-25 06:00:33

标签: java regex negative-lookahead

给定一个网址,我必须匹配网址从某个域开始而不是以某种模式结束 例如,
给定一个网址列表,我想匹配以"http://www.google.com/""http://www.facebook.com/"开头的网址,而不是以".jpg"".bmp"以及".png"

结尾的网址

我试过像

这样的东西
^(http://www\.google\.com/|http://www\.facebook\.com/).*(\.(?!png)|(?!bmp)|(?!jpg))$

但它似乎没有用..有任何错误吗?或者任何其他方式?

3 个答案:

答案 0 :(得分:3)

(?!png)$这样的东西,一般来说都是毫无意义的;它表示“后跟png的位置, 位于字符串末尾”,但当然字符串的结尾是最后从未跟png,因此(?!png)$仅相当于$。 (你明白我的意思吗?)

幸运的是,Java正则表达式支持零宽度 lookbehind 断言,因此您可以编写:

^http://www\.(google|facebook)\.com.*(?<!\.(png|bmp|jpg))$

其中(?<!...)表示“...之前之前的位置”。 (见the Javadoc for java.util.regex.Pattern。)

答案 1 :(得分:2)

这个正则表达式应该有效:

^https?:\/\/(?:www\.)?(?:google|facebook)\.com\/(?!.*?\.(?:jpe?g|png|bmp|gif)$).*$

现场演示:http://www.rubular.com/r/V0X6ve1iUT

Java演示:http://ideone.com/TlCyTG

答案 2 :(得分:1)

尝试这是你想要的确切要求

^(http://www\.google\.com/|http://www\.facebook\.com/)(?!.*?\.(?:jpe?g|png|bmp|gif)$).*$