¿Qué expresión regular coincidirá con el texto excluyendo lo que se encuentra dentro de las etiquetas HTML?

Estoy escribiendo código para una página de resultados de búsqueda que necesita resaltar los términos de búsqueda. Los términos ocurren dentro de las celdas de la tabla (la aplicación está iterando a través de las celdas de fila de GridView) y estas celdas de la tabla pueden tener HTML.

Actualmente, mi código tiene este aspecto (se muestran los fragmentos relevantes a continuación):

const string highlightPattern = @"<span class=""Highlight"">$0</span>";
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];

// Turn "term1 term2" into "(term1|term2)"
string spaceDelimited = txtTextFilter.Text.Trim();
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
string searchPattern = "(" + pipeDelimited + ")";

// Highlight search terms in Customer - Comments column
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);

Sorprendentemente funciona. PERO, a veces el texto que comparo es un HTML que se ve así:

<span class="CustomerName">Fred</span> was a classy individual.

Y si busca "clase", quiero que el código de resaltado incluya la "clase" en "elegante" pero, por supuesto, no el atributo HTML "clase" que está allí. Si buscas "Fred", eso debería estar resaltado.

Entonces, ¿qué es una buena expresión regular que asegure que las coincidencias solo se realicen FUERA de las etiquetas html? No tiene que ser super hardcore. Simplemente asegurarse de que la coincidencia no esté entre <y> funcionaría bien, creo.

Respuestas a la pregunta(4)

Su respuesta a la pregunta