如何访问.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式中指定的命名捕获组?

使用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();