在RegEx中提取组和子组

时间:2011-09-08 20:40:34

标签: c# regex

在某种程度上,这个问题延续了我之前回答的问题:Getting "Unterminated [] set." Error in C#

我在C#中使用正则表达式来提取URL:

Regex find = new Regex(@"(?<First>[,""]url=)(?<Url>[^\\]+)(?<Last>\\u00)");

文本包含以下格式的网址:

,URL = http://domain.com?itag=25 \ u0026,URL = http://hello.com?itag=11 \ u0026

我在'Url'组中获取整个网址,但我也希望在单独的“iTag”组中获得itag值。我知道这可以使用子组完成,我一直在尝试,但无法弄清楚到底是怎么做的。

1 个答案:

答案 0 :(得分:4)

您已在Regex中定义了命名组。语法?<First>正在命名括号First中的所有内容。

使用Regex进行匹配时,使用Groups属性访问GroupCollection并按名称提取组值。

var first = regex.Match(line).Groups["First"].Value;

这将为iTag添加一个额外的组,但保留完整的Url。将其移到另一个括号之外以改变它。

(?<First>[,""]url=)(?<Url>[^\?]+?itag=(?<iTag>[0-9]*))(?<Last>\\u0026)

这是代码。

Regex regex = new Regex("(?<First>[,\"]url=)(?<Url>[^\\?]*\\?itag=(?<iTag>[0-9]*))(?<Last>\\u0026)");
string input = ",url=http://domain.com?itag=25\u0026,url=http://hello.com?itag=11\u0026";

foreach(Match match in regex.Matches(input))
{
    System.Console.WriteLine("1. "+match);
    System.Console.WriteLine("  1. "+match.Groups["First"]);
    System.Console.WriteLine("  2. "+match.Groups["Url"]);
    System.Console.WriteLine("  3. "+match.Groups["iTag"]);
    System.Console.WriteLine("  4. "+match.Groups["Last"]);
}

结果:

1. ,url=http://domain.com?itag=25&
  1. ,url=
  2. http://domain.com?itag=25
  3. 25
  4. &
1. ,url=http://hello.com?itag=11&
  1. ,url=
  2. http://hello.com?itag=11
  3. 11
  4. &