匹配所有URL但排除特定URL的正则表达式

5

我需要匹配除以下URL外的所有有效URL:

http://www.w3.org
http://w3.org/foo
http://www.tempuri.org/foo

通常情况下,匹配除某些特定域名外的所有URL。

这是我目前为止的代码:

https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?  

将匹配足够接近我的需求的URL(但不是所有有效的URL!)(感谢http://snipplr.com/view/2371/regex-regular-expression-to-match-a-url/!)

https?://www\.(?!tempuri|w3)\S*

这个正则表达式将匹配所有带有www.的URL,但不包括tempuriw3域名。

我真的很想要

https?://([-\w\.]+)(?!tempuri|w3)\S*

需要工作,但据我所知,它似乎选择了所有的 http:// 字符串。

天啊,我应该在更高的 Chomsky 层次上完成这个!


1
哇...即使按照URL正则表达式的标准,snipplr的这个表达式也相当糟糕。它将禁止在“?”之前具有各种有效标点符号字符的大量URL。实际上,它甚至不接受此问题的URL。无论如何...如果您想要使用负向先行断言,它应该放在您想要匹配的([-\w.]+)域名位之前。 - bobince
好的,我在声称“所有有效的URL”之前并没有真正尝试过snipplr正则表达式的广泛应用。我会将其编辑掉。 - Noel
1个回答

6
以下是正则表达式的内容:
https?://(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)\S*

只匹配以下节选的前四行

https://ok1.url.com
http://ok2.url.com
https://not.ok.tempuri.com
http://not-ok.either.w3.com

http://no1.w3.org
http://no2.w3.org
http://tempuri.bla.com
http://no4.tempuri.bla
http://no3.tempuri.org
http://w3.org/foo
http://www.tempuri.org/foo

我知道你在想什么,答案是为了匹配上面的列表并且只返回前两行,你需要使用以下正则表达式:

https?://(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)([-\w]*\.)(?!w3|tempuri)\S*

实际上,这只是第一个正则表达式的轻微修改,其中

(?!w3|tempuri)([-\w]*\.)

连续出现两次的部分。

你的正则表达式之所以无法工作,是因为当你在 ()* 中包含 . 时,它不仅可以匹配 this.this.this.,还可以匹配 this.this.th - 换句话说,它不一定以点结束,因此它将强制在必须匹配表达式的地方结束。在正则表达式测试器中尝试一下,你就会明白我的意思。


是的,这个按照广告描述来使用是可以的。然而,现在我意识到Visual Studio搜索正则表达式引擎不支持前瞻,所以我要去一个角落里简化/静静地哭泣了。 - Noel
就记录而言,我最终无法使用前瞻或后缀?运算符。太愚蠢了。所以我运行了[http|https]\://[^w3|^tempuri|^schemas][org|com|net]\S*,然后是[http|https]\://www\.[^w3|^tempuri|^schemas][org|com|net]\S*。唉。 - Noel
这很奇怪,因为我给你的正则表达式是在 .Net 正则表达式引擎上测试过的... 嗯,我得研究一下。也许是 .Net 3.5 的问题?你有最新的版本吗? - PeterM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接