У меня есть переменная типа string, там записан большой текст. У меня есть регулярное выражение Regex regex = new Regex(@"<div class=\""b-opinions-main-2__text\"">.+</div>");, которое хранится в переменной типа string.
На месте .+ должен быть текст. Как мне записать .+ в переменную?
- 725
-
Либо вам сюда https://msdn.microsoft.com/ru-ru/library/system.text.regularexpressions.match.groups%28v=vs.110%29.aspx , либо вам стоит перефразировать задачу – vitidev May 11 '17 at 17:00
-
Есть строка, в строке есть подстроки '<div class=""b-opinions-main-2__text"">Привет Мир ' '<div class=""b-opinions-main-2__text"">пока Мир ' , я составил регулярное выражение '<div class=""b-opinions-main-2__text"">.+', как мне найти все эти подстроки и записать их в другую переменную, чтобы я потом из них мог достать 'Привет Мир' или 'Пока Мир' – Павел Кушнеревич May 11 '17 at 17:13
-
Тогда я дал верную ссылку. – vitidev May 11 '17 at 17:28
2 Answers
HTML нужно парсить с помощью соответствующих инструментов.
Теперь по существу: ту часть регулярного выражения, которую необходимо получить, нужно заключать в неэкранированные круглый скобки. (...) – захватывающая группа. Есть именованные и численные захватывающие группы. Вот пример последней: допустим, есть ваша регулярка, нужно то, что находит .+ - заключаете эту часть в скобки. В коде:
Regex reg = new Regex(@"<div class=\""b-opinions-main-2__text\"">(.+)</div>");
// ^^^^
var resultaty = reg.Matches(str) // Находим все совпадения
.Cast<Match>() // Получаем список объектов Match
.Select(m => m.Groups[1].Value) // Получаем нашу подстроку из группы №1
.ToList(); // Конвертируем в список.
Эта реглярка взята из ТС только как образец. В реальном коде не советую использовать. Пользуйтесь HtmlAgilityPack. Да, можно пытаться её улучшить и даже написать @"(?s)<div\s+class=""b-opinions-main-2__text"">(.+?)</div>", но и эта регулярка в один (не)прекрасный момент может дать сбой, т.к. регулярки не предназначены для парсинга HTML.
- 21,208
Необходимо использовать метод Matches, для получения всех совпадений из класса Regex
string g = "<div class=\"b-opinions-main-2__text\">qwerty</div>";
var regExp = new Regex("(?<=<div class=\"b-opinions-main-2__text\">).+(?=</div>)");
var matches = regExp.Matches(g);
Тип переменной matches — MatchCollection. Данный тип не позволяет использовать LINQ методы, но можно проходить с помощью цикла foreach.
foreach (var m in matches){
Console.WriteLine(m);
}
p.s. Либо используйтесь @, либо экранируйте кавычки, но не все сразу.
- 2,732
-
Данный тип не позволяет использовать LINQ методы - очень даже позволяет. – Wiktor Stribiżew May 11 '17 at 20:32
-
@WiktorStribiżew если сделать приведение типов — да. Напрямую — нет. – Vadim Prokopchuk May 11 '17 at 20:46