解析变量URI(RegEx,Uri,String-Functions?)c#

我正在编写一个RTSP客户端模块,为此,我需要解析一个非常可变的URI。 但我完全不知道应该使用哪种方法(大多数是故障安全的)以及如何实现这一目标。

示例URI可能如下所示:

rtsp://192.168.1.100:554/videocam/media/1/video/1 \_/ \_______________/\_______/\______________/ | | | | scheme authority [sub] [mediacontrol] 

还有其他可能性:

 192.168.1.100/videocam/media/1/video/1 192.168.1.100:6000/media/1/video/1 192.168.1.100:6000/videocam 

我需要以下信息:

 IP | how can I recognise this pattern [num].[num].[num].[num]? Port | easy if the string contains rtsp://, but what about just a number? 1-65555 Sub | Optional subpath, can completely vary! MediaLevel | Optional MediaLevel (indicator for stream/track), not to be confused with the path. MediaLevel can be also just like this: track1 or m1s3 or media1/video1.. see? I can't go for the slash, also the path also can contain multiple slashes 

也许这个任务有一个库?

谢谢。

 var uri = new Uri("rtsp://192.168.1.100:554/videocam/media/1/video/1"); var host = uri.Host; var port = uri.Port; var sub = uri.Segments[1]; var mlevel = uri.Segments.Skip(2).ToArray(); 

这是一个如何使用UriBuilder类的简单示例。 它有点冗长,因为它是一个例子,并没有为生产做好准备。 如果要识别更多潜艇,则可以将它们添加到子列表中,如示例中所示。

 class Program { private static string _scheme = string.Empty; private static string _host = string.Empty; private static string _sub = string.Empty; static void Main(string[] args) { ParseUri("rtsp://192.168.1.100:554/videocam/media/1/video/1"); ParseUri("192.168.1.100/videocam/media/1/video/1"); ParseUri("192.168.1.100:6000/media/1/video/1"); ParseUri("192.168.1.100:6000/videocam"); // example of adding a new sub Sub.Add("sample"); ParseUri("192.168.1.100:6000/sample/"); Console.ReadLine(); } private static void ParseUri(string URI) { UriBuilder uri = new UriBuilder(URI); _scheme = uri.Scheme; _host = uri.Host; _sub = string.Empty; StringBuilder sb = new StringBuilder(); foreach (string s in uri.Uri.Segments) { if (Sub.Contains(s.Replace("/",""))) {_sub = s;} else { sb.Append(s); } } Console.Out.WriteLine("+++++++++++++"); Console.Out.WriteLine("URI: {0}",URI); Console.Out.WriteLine("Scheme: {0}", _scheme); Console.Out.WriteLine("sub: {0}",_sub); Console.Out.WriteLine("mediaControl: {0}", sb.ToString()); } private static List Sub { get { List sub = new List(); sub.Add("videocam"); return sub; } } }