URL的正则表达式,包括查询字符串

我认为这将是一个简单的谷歌搜索,但显然不是。 我可以在C#中使用什么样的正则表达式来解析包含来自较大文本的任何查询字符串的URL? 我花了很多时间,发现了很多不包含查询字符串的例子。 我不能使用System.URI,因为这假设你已经有了URL …我需要在周围的文本中找到它。

这应该得到任何东西(随意添加其他协议):

@"(https?|ftp|file)\://[A-Za-z0-9\.\-]+(/[A-Za-z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*" 

真正的困难是找到目的。 原样,此模式依赖于查找无效字符。 这将是域名结尾之前的字母,数字,连字符或句号以外的任何内容,或者除了正斜杠(/),问号(?),&符号(&),等号(=)之外的任何内容,分号(;),加号(+),感叹号(!),撇号/单引号(’),打开/关闭括号,星号(*),下划线(_),波浪号(〜)或百分号(%) )域名之后。

请注意,这将允许无效的url,如

 http://../ 

并且它会在URL之后拾取内容,例如在此字符串中:

也许你应该尝试http://www.google.com 。

哪里有"http://www.google.com." (与尾随期间)将匹配。

它也会错过不以协议规范开头的URL(特别是第一组括号中的协议。例如,它会错过此字符串中的URL:

也许你应该试试www.google.com。

没有一些更好定义的边界,很难得到每一个案例。

RegexLib有很多有用的东西……

http://regexlib.com/Search.aspx?k=querystring

使用RFC3986末尾的ABNF作为起点,使其正确。

这将它们用于Python中的URIvalidation; 不是你想要的,但它应该让你知道你应该去的方向: http : //gist.github.com/138549

抱歉,我还无法添加评论,但是想指出P Daddy的答案需要稍微调整一下:

 @"(https?|ftp|file)\://[a-zA-Z0-9\.\-]+(/[a-zA-Z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*"