Può capitare di avere un testo html da "normalizzare" ad esempio perchè contine tag mal formattati o url che vanno riadattate.
In questo caso può tornare utile questa funzione che, tramite le Regular Expression, cerca determinati tag html e li sostituisce con una versione modificata (tramite una funzione richiamata per ogni occorrenza trovata).

Nell'esempio cerco tutti i tag di tipo img e anchor e li sostituisco con una versione "semplificata":
using System.Text.RegularExpressions;

/// <summary>
/// ricerca di tag html tramite regular expression
/// e sostituzione tramite una funzione delegato
/// http://www.sgart.it
/// </summary>
/// <param name="html">il testo con i tag html</param>
/// <returns>il testo con i tag sostituiti</returns>
public static string ReplaceHtml(string html)
{
  // uso gli explicit capture (?<nome>...) 
  RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled; 
  // espression per cercare i tag "img" e "a"
  Regex reHtml = new Regex(@"\<(?<tag>(img|a)[^\>]*)\>", options);  
  // espression per cercare gli attributi "src" e "href" all'interno del tag
  Regex reAttr = new Regex(@"\b(?<attr>(src|href))\b=[""'](?<url>[^""']*)", options); 

  // funzione di sostituzione tramite delegato, per ogni tag trovato viene richiamata la funzione delegato
  return reHtml.Replace(html, delegate (Match mHtml)
  {
    // il tag trovato senza i simboli
    string tag = mHtml.Groups["tag"].Value;
    // salvo il tag originale
    string result = result = mHtml.Value;

    // verifica/trova se ha l'attributo src o href
    Match mAttr = reAttr.Match(tag); 
    if (mAttr.Success)
    {
      string attr = mAttr.Groups["attr"].Value;
      string url = mAttr.Groups["url"].Value;
      if (attr.Equals("src", StringComparison.InvariantCultureIgnoreCase))
        result = "<img src=\"" + url + "\" class=\"lazy\">";  // salvo il tag "img" modificato
      else
        if (!(url.StartsWith("javascript:", StringComparison.InvariantCultureIgnoreCase) || url.StartsWith("mailto:", StringComparison.InvariantCultureIgnoreCase)))
          result = "<a href=\"" + url + "\" class=\"replaced\">"; // se non inizia con ... salvo il tag "a" modificato
    }

    // solo per debug
    Console.WriteLine(tag + " \r\n  -- > " + result); 

    return result;  // ritorno il testo da sostituire all'originale
  });
}
in pratica vado a rimuovere dai tag img tutti gli attributi tranne src e dai tag anchor tutti gli attributi tranne href.

Ad esempio
<img src="/_layouts/images/fgimg.png" alt="Passa a livello superiore" style="border:0;position:absolute;left:-0px !important;top:-112px !important;" /></a></span></span><div class="ms-popoutMenu s4-breadcrumb-menu" id="GlobalBreadCrumbNavPopout-menu" style="display:none;">

<a id="ctl00_IdWelcome_ExplicitLogin" class="s4-signInLink" href="http://www.sgart.it/_layouts/Authenticate.aspx?Source=%2FPagine%2Fhome%2Easpx" style="display:inline;">
diventa
<img src="/_layouts/images/fgimg.png" class="lazy">

<a href="http://www.sgart.it/_layouts/Authenticate.aspx?Source=%2FPagine%2Fhome%2Easpx" class="replaced">

Altro caso in cui tornano utili le Regular Expression è quando si devono eliminare dei tag, ad esempio il tag script:
/// <summary>
/// rimozione/disabilitazione dei tag "script"
/// http://www.sgart.it
/// </summary>
/// <param name="html">il testo con i tag html</param>
/// <returns>il testo con i tag sostituiti</returns>
private static string ReplaceHtmlScript(string html)
{
  // non uso gli explicit capture
  RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;  
  // espression per cercare i tag "script"
  Regex reHtml = new Regex(@"<script[^>]*>([\s\S]*?)</script>", options);  

  return reHtml.Replace(html, delegate (Match mHtml)
  {
    // contenuto del tag script, quello all'interno delle parentesi tonde, l'indice 0 indica tutta quello trovato (compreso il tag script iniziale e finale)
    string content = mHtml.Groups[1].Value; 
    // lascio lo script ma lo commento
    return "<!-- script disabled \r\n" + content + " \r\n -->"; 
    // return ""; // tolgo completamente lo script
  });
}
ad esempio
<script type="text/javascript">
   var _fV4UI = true;
</script>
diventa
<!-- script disabled 
   var _fV4UI = true;
 -->