如何使用Regex和C#提取特定的URL段

时间:2019-04-08 18:02:09

标签: c# regex

我有这样的网址:

/domain.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext

有时

http://someother.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext

我需要专门使用C#和Regex提取第6段。正则表达式是绝对的要求,因为我将来可能想通过更改某些配置来提取第3段。

3 个答案:

答案 0 :(得分:2)

.NET具有类UriTemplate(艾米已经在注释中提到了Uri)。匹配网址有很多方面(例如区分大小写,斜杠对斜杠与无尾斜杠等),这会使finding a suitable regular expression的任务过于复杂。

UriTemplate可以直接处理许多此类问题。也许您可以将其用于类似“分而治之”的方法。

Uri baseUri = new Uri("http://someother.com");
UriTemplate template 
    = new UriTemplate("segment1}/{segment2}/{segment3}/{segment4}/{segment5}/{segment6}/{segment7}/{filename}");
Uri fullUri 
    = new Uri("http://someother.com/super1/kali2/fragi3/listig4/expi5/ali6/docious7/filename.ext");

UriTemplateMatch results = template.Match(baseUri, fullUri);

if(results.BoundVariables["segment6"]) {
    WriteLine(results.BoundVariables["segment6"]);
    // Output: "ali6"
    // further regex matching can take place here
}

有关.NET reference documentation的更多信息。

答案 1 :(得分:1)

尝试使用正则表达式:(?<=\.com)(?:\/([^\/]+))+\/[^\/.]+?\.\w+

Regex Demo

C# Demo

答案 2 :(得分:1)

尽管您最好选择URL相关的类来解析URL,如另一个答案中所述,因为经过验证的内置函数已经过很好的测试,甚至可以处理极端情况,但是正如您提到的,您有一些限制,只能使用正则表达式解决方案,您可以尝试以下解决方案。

使用此正则表达式可以轻松地找到第六个或第N个分段

(?:([^/]+)/){7}

捕获6 + 1(第N个段通常为N + 1,其中+1表示URL的匹配域部分),该组保留了最后一个捕获的值,可以使用group1进行访问。

在这里,([^/]+)匹配一个或多个除/以外的任何字符,并捕获group1中的内容,后跟/,并且整个内容恰好匹配7次。

Regex Demo

C# code demo

var pattern = "(?:([^/]+)/){7}";
var match = Regex.Match("/domain.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext", pattern);
Console.WriteLine("Segment: " + match.Groups[1].Value);
match = Regex.Match("http://someother.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext", pattern);
Console.WriteLine("Segment: " + match.Groups[1].Value);

打印第六段的值,

Segment: segment6
Segment: segment6