在 RegEx 中提取组和子组

tun*_*h24 4 c# regex

在某种程度上,这个问题是我之前回答的问题的延续:获取“未终止 [] 设置”。C# 中的错误

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

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

其中文本包含以下格式的 URL:

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

我在“Url”组中获取整个 URL,但我还希望在单独的“iTag”组中拥有 itag 值。我知道这可以使用子组来完成,我一直在尝试,但无法弄清楚如何做到这一点。

The*_*ing 5

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

当您匹配 using 时Regex,使用该Groups属性访问GroupCollection并按名称提取组值。

var first = regex.Match(line).Groups["First"].Value;
Run Code Online (Sandbox Code Playgroud)

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

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

这是代码。

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"]);
}
Run Code Online (Sandbox Code Playgroud)

结果:

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. &
Run Code Online (Sandbox Code Playgroud)