使用正则表达式提取数据url

本文关键字:数据 url 提取 正则表达式 | 更新日期: 2023-09-27 18:02:34

有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'.)?(.*?)(?='/)(.*)(?='/)(.*)$,但这并不是在所有情况下

使用正则表达式提取数据url

我建议您使用现有的Uri类,它可以方便地访问部分uri。示例列表中的一些url没有scheme,所以您只需要手动添加:

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去掉斜杠

使用Uri类来解析url,因为该类被设计为遵循相关的rfc进行解析。该类将允许您访问它所解析的URL的Scheme、主机、端口、路径、查询字符串等。