Regex C# как ограничить захват?

Есть задача выбирать значения только корректных тегов. Я приведу пример

List<string> res = new List<string>();
string input = "<p>vasya<p>lena</p><p>gena</p>";
string pattern = "<p>(.*?)</p>";
var matches = Regex.Matches(input, pattern);
foreach (Match m in matches)
{
    res.Add(m.Groups[1].Value);
}

Заметьте довольно простое рег. выражение, но к сожалению оно выдает

res[0] "vasya<p>lena"
res[1] "gena"

а должно взять только lena и gena.

Хотелось бы решить не только этот конкретный пример, а научиться универсально ограничивать регулярку последним началом до (.*?) к первому концу


Ответы (1 шт):

Автор решения: aepot

Дописать регулярку так, чтобы она обрабатывала ваш случай.

Например так, исключая символ <:

string pattern = @"<p>([^<]*?)<\/p>";
res[0] "lena"
res[1] "gena"

Или лучше используйте нормальный парсер.

using HtmlAgilityPack;

// ...

List<string> res = new List<string>();
string input = "<p>vasya<p>lena</p><p>gena</p>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(input);
foreach(HtmlNode node in doc.DocumentNode.ChildNodes)
{
    if (node.Name == "p") res.Add(node.InnerText);
}

Вот кстати сайт, очень подходящий для тестирвоания регулярок. Рекомендую.

→ Ссылка