如何访问.NET Regex中的命名捕获组?

我很难find一个很好的资源,解释如何在C#中使用命名捕获组。 这是我到目前为止的代码:

string page = Encoding.ASCII.GetString(bytePage); Regex qariRegex = new Regex("<td><a href=\"(?<link>.*?)\">(?<name>.*?)</a></td>"); MatchCollection mc = qariRegex.Matches(page); CaptureCollection cc = mc[0].Captures; MessageBox.Show(cc[0].ToString()); 

然而,这总是显示整条线:

 <td><a href="/path/to/file">Name of File</a></td> 

我已经尝试了在其他网站上find的其他几种“方法”,但我仍然得到相同的结果。

我如何访问在我的正则expression式中指定的命名捕获组?

  • 用于检查string是否严格字母数字的正则expression式
  • Javascript / jQuery:分割camelcasestring并添加连字符而不是空格
  • 正则expression式匹配跨平台换行符
  • LINQ to Entities仅支持使用IEntity接口来投射EDM原语或枚举types
  • 如何在执行Regex.Replace()时使用命名组
  • Python:检查列表中是否至less有一个正则expression式匹配string的优雅方法
  • 崇高文本中的RegEx:匹配任何字符,包括换行符?
  • 在可变长度lookbehind中平衡组
  • 4 Solutions collect form web for “如何访问.NET Regex中的命名捕获组?”

    使用Match对象的组合,使用捕获组名称进行索引,例如

     foreach (Match m in mc){ MessageBox.Show(m.Groups["link"].Value); } 

    通过将指定的捕获组string传递给所得到的Match对象的Groups属性的索引器来指定命名的捕获组string。

    这是一个小例子:

     using System; using System.Text.RegularExpressions; class Program { static void Main() { String sample = "hello-world-"; Regex regex = new Regex("-(?<test>[^-]*)-"); Match match = regex.Match(sample); if (match.Success) { Console.WriteLine(match.Groups["test"].Value); } } } 

    下面的代码示例将匹配模式,即使在空格字符之间。 即:

     <td><a href='/path/to/file'>Name of File</a></td> 

    以及:

     <td> <a href='/path/to/file' >Name of File</a> </td> 

    方法返回true或false,取决于input的htmlTdstring是否匹配模式或否。 如果匹配,则out params分别包含链接和名称。

     /// <summary> /// Assigns proper values to link and name, if the htmlId matches the pattern /// </summary> /// <returns>true if success, false otherwise</returns> public static bool TryGetHrefDetails(string htmlTd, out string link, out string name) { link = null; name = null; string pattern = "<td>\\s*<a\\s*href\\s*=\\s*(?:\"(?<link>[^\"]*)\"|(?<link>\\S+))\\s*>(?<name>.*)\\s*</a>\\s*</td>"; if (Regex.IsMatch(htmlTd, pattern)) { Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); link = r.Match(htmlTd).Result("${link}"); name = r.Match(htmlTd).Result("${name}"); return true; } else return false; } 

    我已经testing了这一点,它工作正常。

    此外,如果某人在执行Regex对象search之前有一个需要组名的用例,他可以使用:

     var regex = new Regex(pattern); // initialized somewhere // ... var groupNames = regex.GetGroupNames();