如何访问.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();
- 如何在.NET中replacestring的*第一个实例?
- 为什么List <T>不是线程安全的?
- 不能将types'System.Collections.Generic.IEnumerable <AnonymousType#1>'隐式转换为'System.Collections.Generic.List <string>
- 什么真实世界的WPF应用程序在那里?
- 终极的Visual Studio解决scheme结构
- 为什么我的一系列结构占用了太多的内存?
- 你应该实现IDisposable.Dispose(),使它永远不会抛出?
- 从一个string创build一个类的实例
- 从C#中的.resx文件读取string