【问题标题】:Regex to match all URLs except certain URLs正则表达式匹配除某些 URL 之外的所有 URL
【发布时间】:2010-02-16 23:58:55
【问题描述】:

我需要匹配所有有效的 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. 的网址,但不在tempuriw3 域中。

我真的很想要

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

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

啊,我应该在乔姆斯基层级更高的地方做这件事!

【问题讨论】:

  • 哇...即使按照 URL regexen 的标准,这也是来自 snipplr 的一个非常糟糕的标准。它将禁止在? 之前包含各种有效标点符号的大量 URL。事实上,它甚至不会接受这个问题的 URL。无论如何......如果你想要这样做,那么它应该在之前在你do想要匹配的([-\w\.]+)域名位之前进行。
  • 好点,在提出“所有有效网址”声明之前,我并没有真正尝试过任何广泛的 snipplr 正则表达式。我将其编辑出来。

标签: regex url


【解决方案1】:

以下正则表达式:

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

【讨论】:

  • 是的,这就像宣传的那样有效。但是,现在我意识到 Visual Studio 搜索正则表达式引擎不支持前瞻,所以我要简化/在角落里安静地抽泣。
  • 为了记录,我最终无法使用前瞻或后缀?操作员。愚蠢的。所以我跑了[http|https]\://[^w3|^tempuri|^schemas][org|com|net]\S* 然后[http|https]\://www\.[^w3|^tempuri|^schemas][org|com|net]\S*。嘘。
  • 这很奇怪,因为我给你的正则表达式是在 .Net 正则表达式引擎上测试的……嗯,我得研究一下。也许是 .Net 3.5 的东西?你有最新的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多