我有这样的网址:
/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段。
答案 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)
答案 2 :(得分:1)
尽管您最好选择URL相关的类来解析URL,如另一个答案中所述,因为经过验证的内置函数已经过很好的测试,甚至可以处理极端情况,但是正如您提到的,您有一些限制,只能使用正则表达式解决方案,您可以尝试以下解决方案。
使用此正则表达式可以轻松地找到第六个或第N个分段
(?:([^/]+)/){7}
捕获6 + 1(第N个段通常为N + 1,其中+1表示URL的匹配域部分),该组保留了最后一个捕获的值,可以使用group1进行访问。
在这里,([^/]+)
匹配一个或多个除/
以外的任何字符,并捕获group1中的内容,后跟/
,并且整个内容恰好匹配7次。
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