正则表达式匹配除某些URL之外的所有URL

时间:2010-02-16 23:58:56

标签: regex url

我需要匹配除以下所有有效网址:

  

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

通常,除某些域外的所有网址。

这是我到目前为止所做的:

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

会匹配足够接近我需要的网址(但绝不是所有有效的网址!)(谢谢,http://snipplr.com/view/2371/regex-regular-expression-to-match-a-url/!)

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

会将所有网址与www.匹配,但不会与tempuriw3域匹配。

我真的想要

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

工作,但是,但是,它似乎选择了所有http://字符串。

Gah,我应该在Chomsky等级的更高层面做这件事!

2 个答案:

答案 0 :(得分:3)

以下正则表达式:

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 - 换句话说,它不一定以点结尾,因此它会强制它在任何地方结束,以便表达式匹配。在正则表达式测试器中试一试,你会明白我的意思。

答案 1 :(得分:0)