我需要匹配所有有效的 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.,但不在tempuri或w3域中的 URL。
我真的想要
https?://([-\w\.]+)(?!tempuri|w3)\S*
工作,但afaick,它似乎选择了所有http://字符串。
啊,我应该在乔姆斯基层次更高的地方做这件事!
下面的正则表达式:
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.th - 换句话说,它不一定以点结尾,因此它将强制它在必须结束的地方结束,以便表达式匹配。在正则表达式测试器中尝试一下,您就会明白我的意思。