Лучше всего показано на примере. Строка. 192.168.1.1 и жадное регулярное выражение \ b. + \ B Возможно, вы думаете, что это даст вам 1-й октет, но на самом деле соответствует всей строке. ЗАЧЕМ!!! Поскольку. + Жадный и жадный матч соответствует каждому символу в '192.168.1.1', пока он не достигнет конца строки. Это важный бит !!! Теперь он начинает возвращать один символ за раз, пока не найдет совпадение для третьего токена (\ b).
Если строка с текстовым файлом 4 ГБ и 192.168.1.1 была в начале, вы могли легко увидеть как этот откат вызовет проблему.
Чтобы сделать регулярное выражение, не жадное (ленивое), поставить вопросительный знак после вашего жадного поиска, например *? ?? +? Теперь происходит токен 2 (+?) Находит совпадение, регулярное выражение перемещается вдоль символа, а затем пытается использовать следующий токен (\ b), а не токен 2 (+?). Таким образом, он медленно дергается.
Попытка разобрать 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;