stackoverflow regular online ismatch characters all c# regex

regular - regex.ismatch c#



C#Cómo eliminar comentarios XML/HTML con expresiones regulares (4)

El fragmento de abajo no funciona para mí.

fragment = Regex.Replace(fragment, "<!--.*?-->", String.Empty , RegexOptions.Multiline );


Esta funciona para mí:

<!--(/n|.)*-->

Pero creo que podría usar un documento XML normal para el XML o, de lo contrario, HtmlAgilityPack para HTML. Altamente no recomiendo analizar marcas usando RegEx.


Este es el resultado principal de Google para eliminar comentarios a través de C #, y aquí está mi código HtmlAgilityPack para hacer esto.

HtmlDocument doc = new HtmlDocument { OptionFixNestedTags = true, OptionOutputAsXml = true }; doc.LoadHtml(str); // Script comments from the document. if (doc.DocumentNode != null) { HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//comment()"); if (nodes != null) { foreach (HtmlNode node in from cmt in nodes where (cmt != null && cmt.InnerText != null && !cmt.InnerText.ToUpper().StartsWith("DOCTYPE")) && cmt.ParentNode != null select cmt) { node.ParentNode.RemoveChild(node); } } }

Esto funciona correctamente al eliminar comentarios, e ignora el doctype que se trata como un comentario por parte de HtmlAgilityPack.

Mientras que regex funciona en condiciones controladas. Si estás procesando HTML desde la web salvaje, entonces te recomiendo usar HtmlAgilityPack. El HTML que está disponible es muy impredecible, y la expresión regular se romperá.


No use expresiones regulares para trabajar con lenguajes de marcado, necesita usar una mejor herramienta que esté diseñada para ese tipo de trabajo.

Utilice el paquete de agliy de HTML en su lugar. Incluso encontré este artículo en el que un lector (llamado Simon Mourier) comenta con una función que usa el paquete de agilidad de HTML para eliminar comentarios de un documento:

Simon Mourier dijo:

Este es un código de muestra para eliminar comentarios:

static void Main(string[] args) { HtmlDocument doc = new HtmlDocument(); doc.Load("filewithcomments.htm"); doc.Save(Console.Out); // show before RemoveComments(doc.DocumentNode); doc.Save(Console.Out); // show after } static void RemoveComments(HtmlNode node) { if (!node.HasChildNodes) { return; } for (int i=0; i<node.ChildNodes.Count; i++) { if (node.ChildNodes[i].NodeType == HtmlNodeType.Comment) { node.ChildNodes.RemoveAt(i); --i; } } foreach (HtmlNode subNode in node.ChildNodes) { RemoveComments(subNode); } }


RegExOptions.Singleline por RegExOptions.Singleline en RegExOptions.Singleline lugar y funcionará bien. Cuando no está en el modo de línea simple, el punto coincide con cualquier carácter, excepto en la nueva línea.

Tenga en cuenta que Singleline y Multiline no se excluyen mutuamente. Hacen dos cosas separadas. Para citar MSDN:

Modo multilínea . Cambia el significado de ^ y $ para que coincidan al principio y al final, respectivamente, de cualquier línea, y no solo al principio y al final de toda la cadena.

Modo de una sola línea . Cambia el significado del punto (.) Para que coincida con cada carácter (en lugar de cada carácter excepto / n).

Otras personas ya han sugerido el paquete de agilidad HTML. Simplemente sentí que deberías tener una explicación sobre por qué tu Regex no funcionaría :)