Мне трудно найти хороший ресурс, который объясняет, как использовать именованные группы захвата в 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>
Я экспериментировал с несколькими другими «методами», которые я нашел на различных сайтах, но я продолжаю получать тот же результат.
Как я могу получить доступ к именованным группам захвата, которые указаны в моем регулярном выражении?
<>
она сломается. Вы можете использовать(?'link'.*)
вместо этого в этом случае. Не совсем уместно в этом вопросе, но я попал сюда из поиска в Google «.net именованных групп захвата», так что я уверен, что другие люди тоже ...<>
не сломает. Я смог использоватьmyRegex.GetGroupNames()
коллекцию в качестве имен элементов XML.Ответы:
Используйте коллекцию групп объекта Match, проиндексировав его с помощью имени группы захвата, например
источник
var m
, так как это будетobject
.Вы указываете именованную строку группы захвата, передавая ее индексатору
Groups
свойства результирующегоMatch
объекта.Вот небольшой пример:
источник
Следующий пример кода будет соответствовать шаблону даже в случае пробелов между ними. т.е.
так же как:
Метод возвращает true или false, в зависимости от того, соответствует ли введенная строка htmlTd шаблону или нет. Если это соответствует, выходные параметры содержат ссылку и имя соответственно.
Я проверил это, и он работает правильно.
источник
${1}
чтобы держать вещи еще проще.Кроме того, если у кого-то есть сценарий использования, где ему нужны имена групп перед выполнением поиска по объекту Regex, он может использовать:
источник
Этот ответ улучшает ответ Рашми Пандита , который несколько лучше, чем остальные, потому что кажется, что он полностью решает точную проблему, подробно описанную в вопросе.
Плохая часть заключается в том, что он неэффективен и не использует опцию IgnoreCase последовательно.
Неэффективная часть заключается в том, что регулярное выражение может быть дорогим для создания и выполнения, и в этом ответе оно могло быть
Regex.IsMatch
создано только один раз (вызов просто создавал регулярное выражение снова за сценой). ИMatch
метод мог быть вызван только один раз и сохранен в переменной, а затемlink
иname
должен вызыватьсяResult
из этой переменной.И опция IgnoreCase использовалась только в
Match
части, но не вRegex.IsMatch
части.Я также переместил определение Regex за пределы метода, чтобы создать его только один раз (я думаю, это разумный подход, если мы храним эту сборку с
RegexOptions.Compiled
опцией).источник