使用Regex提取数据URL

时间:2014-05-09 23:00:47

标签: c# regex url

我有网址

domain.com
domain.com/
www.domain.com
http://www.domain.com
http://domain.com
domain.com/catalog/nextcatalog/
domain.com/catalog/nextcatalog/page.html
domain.com/page.html
domain.com/page.html?arg=123&arg2=abc

我想获得这样的数据

[0] = domain.com
[1] = catalog/nextcatalog/
[2] = page.html
[3] = arg=123&arg2=abc

我不知道如何从像这样的链接获取数据

domain.com

[0] 的情况下,我有 http:

如果不在链接中,可以创建可以跳过示例目录或页面的通用正则表达式吗?

我尝试像^(?:http:\/\/)?(?:www\.)?(.*?)(?=\/)(.*)(?=\/)(.*)$一样创建patern,但这并不适用于所有情况

2 个答案:

答案 0 :(得分:2)

使用Uri class来解析URL,因为该类旨在遵循相关的RFC进行解析。该类将允许您访问它解析的URL的Scheme,host,port,path,querystring等。

答案 1 :(得分:2)

我建议你使用现有的Uri类,它可以方便地访问uri的部分内容。示例列表中的某些网址没有方案,因此您只需手动添加它:

Uri uri = new Uri(url.StartsWith("http") ? url : "http://" + url);

现在您可以使用Uri.Host来获取uri的主机。对于您来说,样本输入主机将是

"domain.com"
"domain.com"
"www.domain.com"
"www.domain.com"
"domain.com"
"domain.com"
"domain.com"
"domain.com"
"domain.com"

你可以做简单的字符串替换来摆脱www部分:

uri.Host.Replace("www.", "")

接下来查询参数。你可以从Url.Query获得它们。在您的示例输入中,只有一个url具有查询参数。返回值将是

?arg=123&arg2=abc

同样,很容易摆脱开始?

uri.Query.TrimStart('?') // arg=123&arg2=abc

Uri还有Segments集合,其中包含一系列细分。您可以检查最后一个段是否包含.以获得下一个结果:

uri.Segments.Last().Contains('.') ? uri.Segments.Last() : ""

如果这是真的,那么您将在最后一段获得page.html。输出:

""
""
""
""
""
""
"page.html"
"page.html"
"page.html"  

您还可以使用简单的String.Join将其他段连接成字符串。或者您可以在Uri.LocalPath上执行字符串替换:

uri.Segments.Last().Contains('.') ?
   uri.LocalPath.Replace(uri.Segments.Last(), "") : uri.LocalPath;

输出:

""
""
""
""
""
"/catalog/nextcatalog/"
"/catalog/nextcatalog/"
"/"
"/"

你需要做的就是TrimStart摆脱斜线。