C # regex para obter o ID de vídeo do youtube e vimeo por url

Estou ocupado tentando criar duas expressões regulares para filtrar o id dos vídeos do youtube e vimeo. Eu já tenho as seguintes expressões;

YouTube: (youtube\.com/)(.*)v=([a-zA-Z0-9-_]+) Vimeo: vimeo\.com/([0-9]+)$ 

Como expliquei abaixo, há dois tipos de URLs correspondidos pelas expressões regulares que eu já criei. Vários outros tipos de URLs do Vimeo e do YouTube não são abrangidos pelas expressões. O que eu mais prefiro é que tudo isso possa ser coberto em duas expressões. Um para todos os vídeos do Vimeo e um para todos os vídeos do youtube. Eu tenho estado ocupado experimentando algumas expressões diferentes, mas sem sucesso até agora. Eu ainda estou tentando dominar expressões regulares, então eu espero que eu esteja no caminho certo e alguém possa me ajudar! Se mais informações forem necessárias, por favor me avise!

URLs VIMEO NÃO CORRIGIDOS:

 http://vimeo.com/channels/hd#11384488 http://vimeo.com/groups/brooklynbands/videos/7906210 http://vimeo.com/staffpicks#13561592 

URLs do YOUTUBE NÃO MATCHED

 http://www.youtube.com/user/username#p/a/u/1/bpJQZm_hkTE http://www.youtube.com/v/bpJQZm_hkTE http://youtu.be/bpJQZm_hkTE 

URLs correspondidos

 http://www.youtube.com/watch?v=bWTyFIYPtYU&feature=popular http://vimeo.com/834881 

A ideia é combinar todos os URLs mencionados acima com duas expressões regulares. Um para o vimeo e outro para o youtube.

ATUALIZAR APÓS RESPOSTA Sedith:

É assim que minhas expressões parecem agora

 public static readonly Regex VimeoVideoRegex = new Regex(@"vimeo\.com/(?:.*#|.*/videos/)?([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Multiline); public static readonly Regex YoutubeVideoRegex = new Regex(@"youtu(?:\.be|be\.com)/(?:(.*)v(/|=)|(.*/)?)([a-zA-Z0-9-_]+)", RegexOptions.IgnoreCase); 

E no código eu tenho

 var youtubeMatch = url.match(YoutubeVideoRegex ); var vimeoMatch = url.match(VimeoVideoRegex ); var youtubeIndex = (youtubeMatch.length - 1) var youtubeId = youtubeMatch[youtubeIndex]; 

Como você pode ver, agora preciso encontrar o índice em que o videoId está na matriz com correspondências retornadas da regex. Mas eu quero que apenas retorne o id, então eu não preciso modificar o código quando o youtube do vimeo decidir mudar os urls. Alguma dica sobre isso?

Eu tive uma brincadeira com os exemplos e surgiu com estes:

 Youtube: youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+) Vimeo: vimeo\.com/(?:.*#|.*/videos/)?([0-9]+) 

E eles devem corresponder a todos aqueles dados. O (?: …) significa que tudo dentro do colchete não será capturado. Então, apenas o id deve ser obtido.

Eu sou um pouco novato em regex, então não se surpreenda se alguém entrar aqui gritando para não me ouvir, mas espero que isso ajude.

Eu acho este site extremamente útil para descobrir os padrões: http://www.regexpal.com/

Editar:

obtenha o id assim:

 string url = ""; //url goes here! Match youtubeMatch = YoutubeVideoRegex.Match(url); Match vimeoMatch = VimeoVideoRegex.Match(url); string id = string.Empty; if (youtubeMatch.Success) id = youtubeMatch.Groups[1].Value; if (vimeoMatch.Success) id = vimeoMatch.Groups[1].Value; 

Isso funciona na planície velha c # .net, não posso garantir o asp.net

Caso você esteja escrevendo algum aplicativo com modelo de visualização (por exemplo, ASP.NET MVC):

 public string YouTubeUrl { get; set; } public string YouTubeVideoId { get { var youtubeMatch = new Regex(@"youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)") .Match(this.YouTubeUrl); return youtubeMatch.Success ? youtubeMatch.Groups[1].Value : string.Empty; } } 

Vimeo:

 vimeo\.com/(?:.*#|.*/)?([0-9]+)