Как получить доступ к именованным группам захвата 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> 


я экспериментировал с несколькими другими "методами", которые я нашел на разных сайтах, но я получаю тот же результат.



Как я могу получить доступ к именованным группам захвата, которые указаны в моем регулярном выражении?

399   4  

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

    Ничего не найдено.