Манипуляция HTML-файлом приводит к неправильным индексам String [duplicate]

Лучше всего показано на примере. Строка. 192.168.1.1 и жадное регулярное выражение \ b. + \ B Возможно, вы думаете, что это даст вам 1-й октет, но на самом деле соответствует всей строке. ЗАЧЕМ!!! Поскольку. + Жадный и жадный матч соответствует каждому символу в '192.168.1.1', пока он не достигнет конца строки. Это важный бит !!! Теперь он начинает возвращать один символ за раз, пока не найдет совпадение для третьего токена (\ b).

Если строка с текстовым файлом 4 ГБ и 192.168.1.1 была в начале, вы могли легко увидеть как этот откат вызовет проблему.

Чтобы сделать регулярное выражение, не жадное (ленивое), поставить вопросительный знак после вашего жадного поиска, например *? ?? +? Теперь происходит токен 2 (+?) Находит совпадение, регулярное выражение перемещается вдоль символа, а затем пытается использовать следующий токен (\ b), а не токен 2 (+?). Таким образом, он медленно дергается.

1
задан user1622436 16 October 2012 в 11:27
поделиться

1 ответ

Попытка разобрать html с регулярным выражением - это не очень хорошая идея. См. этот пост . Используйте настоящий html-парсер, например HtmlAgilityPack .

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(content);
foreach (var a in doc.DocumentNode.Descendants("a"))
{
    a.Attributes["href"].Value = "http://a.com?url=" + HttpUtility.UrlEncode(a.Attributes["href"].Value);
}

var newContent = doc.DocumentNode.OuterHtml;
8
ответ дан Community 25 August 2018 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: