Код замены, который опубликовал Питер, выполняет свою работу, и использование StringBuilder с известной полученной длиной является разумным способом сохранить производительность.
Должен делать то, что вы просили, но иногда при работе со структурированными данными, такими как html, предпочтительно загружать его как XML (для этого я использовал HtmlAgilityPack ). Затем вы можете использовать XPath, чтобы найти узел, который вы хотите заменить, и работать с ним. Это может быть медленнее, но, как я уже сказал, тогда вы можете работать со структурой.