正则表达式在C#之外工作

时间:2013-10-17 16:19:02

标签: c# regex youtube

我很想知道为什么一个模式在C#代码中不匹配,而sme在http://gskinner.com上成功执行。模式是:

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

我想匹配

我试过C# -

YoutubeVideoRegex = new Regex(@"^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$", RegexOptions.IgnoreCase);

youtubeMatch = YoutubeVideoRegex.Match(url);
if (youtubeMatch.Success)
{
id = youtubeMatch.Groups[1].Value; // I want this                
}

但它不匹配。请帮忙吗?`

2 个答案:

答案 0 :(得分:3)

您正在尝试访问群组[1],但它看起来不像您的正则表达式捕获了任何群组。难道你不能只使用youtubeMatch.ToString或Groups [0]来获取你所追求的(整个匹配?),而不是试图访问你未定义的子组?

修改

当我从最后一组括号中删除?:时,您的表达式似乎更有效。我的理解是,如果括号表达式以?:开头,则表明您希望将表达式捕获到组中,并且如果它以{{1}开头你正在定义一个零宽度断言,因为它是零宽度,显然不能捕获任何东西。如果您希望填充?=,则表达式中需要一些实际上执行捕获内容的括号。

修改

根据到目前为止的评论和一些猜测你正在尝试做的事情,这里有一个更新的正则表达式和一些更新的代码来演示它。它适用于您在评论中提到的2个URL,其中一个不起作用:

Groups

textBox2填充了整个匹配的URL,textBox3只填充了“v”查询参数。

答案 1 :(得分:2)

我刚刚运行了您的代码,它与您的两个示例匹配:http: - >

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports http://www.youtube.com/watch?v=KsH63qJlIMM

但不是这个 - >

www.youtube.com/watch?v=KsH63qJlIMM

因为它显然没有你的正则表达式所要求的http:。你想要那个是可选的吗?

如果是这样,那就去做吧:

^(http:\/\/)?(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

它抓住了它