Как получить доступ к именованным группам захвата a.NET регулярное выражение?
мне трудно найти хороший ресурс, который объясняет, как использовать именованные группы захвата в 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>
я экспериментировал с несколькими другими "методами", которые я нашел на разных сайтах, но я получаю тот же результат.
Как я могу получить доступ к именованным группам захвата, которые указаны в моем регулярном выражении?
4 ответов:
используйте коллекцию групп объекта Match, индексируя ее с именем группы захвата, например
foreach (Match m in mc){ MessageBox.Show(m.Groups["link"].Value); }
вы указываете именованную строку группы захвата, передавая ее индексатору
Groupsсвойство результирующего
следующий пример кода, будет соответствовать шаблону даже в случае пробелов между ними. т. е. :
<td><a href='/path/to/file'>Name of File</a></td>а также:
<td> <a href='/path/to/file' >Name of File</a> </td>метод возвращает true или false, в зависимости от того, соответствует ли входная строка htmlTd шаблону или нет. Если он совпадает, то параметры out содержат ссылку и имя соответственно.
/// <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; }Я проверил это, и это работает правильно.
кроме того, если у кого-то есть случай использования, когда ему нужны имена групп перед выполнением поиска по объекту Regex, он может использовать:
var regex = new Regex(pattern); // initialized somewhere // ... var groupNames = regex.GetGroupNames();
Comments