visual quick online matches c# regex

c# - quick - ¿Qué regex coincidirá con el texto excluyendo lo que se encuentra dentro de las etiquetas HTML?



regex quick reference (4)

Hmm, no soy un programador de C #, así que no sé el sabor de la expresión regular que usa, pero (?! <. +?>) Debería ignorar cualquier cosa dentro de las etiquetas. Te obligará a usar & # 60 y # 62 en tu código HTML, pero deberías estar haciendo eso de todos modos.

Estoy escribiendo un código para una página de resultados de búsqueda que debe resaltar los términos de búsqueda. Los términos suceden dentro de las celdas de la tabla (la aplicación se itera a través de celdas de filas de GridView), y estas celdas de la tabla pueden tener HTML.

En la actualidad, mi código se ve así (se muestran hunks 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 con el que estoy haciendo una coincidencia es 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 ajuste la "clase" en "con clase" pero, por supuesto, ¡no la clase de atributo HTML que está ahí! Si busca "Fred", eso debe resaltarse.

Entonces, ¿qué es una buena expresión regular que se asegurará de que las coincidencias solo sucedan FUERA de las etiquetas html? No tiene que ser súper duro. Simplemente, asegurarse de que la coincidencia no esté entre <y> funcionaría bien, creo.


Puede usar una expresión regular con grupos de equilibrio y referencias, pero le recomiendo que use un analizador aquí.


Escribir una expresión regular que pueda manejar secciones de CDATA va a ser difícil. Ya no puede suponer que> cierra una etiqueta.

Por ejemplo, "<span class="CustomerName>Fred.</span> is a good customer (<![CDATA[ >10000$ ]]> )"

La solución es (como se señaló anteriormente) un analizador. Son mucho mejores para lidiar con el tipo de desastre que encuentras en un CDATA . La verificación hacia atrás de madgnome no se puede utilizar para encontrar el <![CDATA de a ]]> inicial, ya que una sección CDATA puede incluir el literal <![CDATA .


Esta expresión regular debería hacer el trabajo: (?<!<[^>]*)(regex you want to check: Fred|span) Comprueba que es imposible hacer coincidir la expresión regular <[^>]* retrocediendo desde una juego de cuerdas

Código modificado a continuación:

const string notInsideBracketsRegex = @"(?<!<[^>]*)"; 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 + ")"; searchPattern = notInsideBracketsRegex + searchPattern; // Highlight search terms in Customer - Comments column e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);