using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Collections;
public class URLParser: UriBuilder
public bool IsPortSet{get;set;}
public string URL{get;set;}
public static URLParser Parse(string input)
URLParser obj = new URLParser();
Action<URLParser,int> santitzePort = (obj,port)=>{
Regex schemeMatcher=new Regex(@"(\w+)(:){1}//", RegexOptions.IgnoreCase);
if(schemeMatcher.IsMatch(input))
obj.Scheme = schemeMatcher.Matches(input).Select(x=>x.Value).Aggregate("", (str, obj) => str + obj.ToString());
Regex hostMatcher = new Regex(@"((\w+)(:))?(www\.)?([^\/]*)(\/.*)?|((\w+)(:)(\w+))$", RegexOptions.IgnoreCase);
if(hostMatcher.IsMatch(input))
string strHost = string.Empty;
if(new Regex(@"((\w+)(:)(\w+))$", RegexOptions.IgnoreCase).IsMatch(input))
var arrURL = input.Split(new char[]{':'},StringSplitOptions.RemoveEmptyEntries);
strHost = arrURL.First();
var port = Convert.ToInt32(String.Join("", arrURL.Last().Where(c=>Char.IsDigit(c))));
strHost = hostMatcher.Matches(input).Select(x=>x.Value).Aggregate("", (str, obj) => str + obj.ToString());
Regex portMatcher = new Regex(@"[:]{1}[\d+]+", RegexOptions.IgnoreCase);
if(portMatcher.IsMatch(input))
var port = Convert.ToInt32(String.Join("",hostMatcher.Matches(input).Select(x=>x.Value).Aggregate("", (str, obj) => str + obj.ToString()).ToArray().Where(c=>Char.IsDigit(c))));
this.URL = this.Scheme+"://"+this.Host+":"+this.Port+ this.Path + this.Query + this.Fragment;
Console.WriteLine(this.URL);
public static void Main()
string[] inputs = new string[]{
"server:8088/func1/SubFunc1",
"http://server/func/SubFunc1",
"http://server:8088/func1",
"http://server:8088/func1/SubFunc1",
"magnet://server/func/SubFunc1",
"magnet://server:8088/func1",
"magnet://server:8088/func1/SubFunc1",
"http://[2001:db8::1]:80"
foreach(var userEnteredText in inputs.Take(2))
URLParser uriBuilder = URLParser.Parse(userEnteredText);
Console.WriteLine("Scheme: "+uriBuilder.Scheme);
Console.WriteLine("Host: "+uriBuilder.Host);
Console.WriteLine("Port: "+uriBuilder.Port);
Console.WriteLine("Path: "+uriBuilder.Path);
Console.WriteLine("Query: "+uriBuilder.Query);
Console.WriteLine("Fragment: "+uriBuilder.Fragment);
Console.WriteLine("URL usable by HttpWebRequest: "+ uriBuilder.Cook());
Console.WriteLine("ERROR: "+ex.Message+" - "+ userEnteredText);