validar solo regulares regular que parentesis para numeros nombres minimo mayores letras expresiones expresion ejemplos ejemplo crear caracteres xml regex pretty-print

solo - Regex para sangrar un archivo XML



expresion regular solo numeros mayores que 0 (7)

¿Es posible escribir un REGEX (reemplazo de búsqueda) que cuando se ejecuta en una cadena XML [... cualquier cosa]

No.

Use un analizador XML para leer la cadena, luego un serializador XML para volver a escribirlo en el modo "bonita".

Cada procesador XML tiene sus propias opciones, por lo que depende de la plataforma, pero esta es la manera un tanto larga que funciona en implementaciones DOM Level 3 LS-obedientes:

input= implementation.createLSInput(); input.stringData= unprettyxml; parser= implementation.createLSParser(implementation.MODE_SYNCHRONOUS, null); document= parser.parse(input); serializer= implementation.createLSSerializer(); serializer.domConfig.setParameter("format-pretty-print", true); prettyxml= serializer.writeToString(document);

¿Es posible escribir un REGEX (reemplazo de búsqueda) que cuando se ejecuta en una cadena XML dará como resultado una cadena XML sangrada?

Si es así, cuál es el REGEX :)


Esto solo sería factible con múltiples expresiones regulares, que funcionarán como una máquina de estado.

Lo que está buscando es mucho más adecuado para un analizador sin sentido.


Hacer esto sería mucho, mucho más simple si no usara una expresión regular. De hecho, ni siquiera estoy seguro de que sea posible con regex.

La mayoría de los lenguajes tienen bibliotecas XML que hacen que esta tarea sea muy simple. Qué idioma estás usando?


No sé si una expresión regular, de forma aislada, podría hacer un formato de impresión bonita de una entrada XML arbitraria. Necesitará que un programa aplique una expresión regular para encontrar una etiqueta, busque las etiquetas de cierre coincidentes (si la etiqueta no se cierra automáticamente), y así sucesivamente. Usar regex para resolver este problema es realmente usar la herramienta incorrecta para el trabajo. La manera más sencilla de imprimir bastante XML es usar un analizador XML, leerlo, configurar las opciones de serialización apropiadas y luego serializar el XML de nuevo.

¿Por qué quieres usar Regex para resolver este problema?


Usar una expresión regular para esto será una pesadilla. Hacer un seguimiento del nivel de sangría basado en la jerarquía de los nodos será casi imposible. Tal vez el motor de expresiones regulares de Perl 5.10 podría ayudar ya que ahora es reentrante. Pero no entremos en ese camino ... Además, tendrá que tener en cuenta las secciones de CDATA que pueden incrustar declaraciones XML que deben ser ignoradas por la sangría y conservadas intactas.

Quédate con DOM. Como se sugirió en la otra respuesta, algunas bibliotecas ya proporcionan una función que sangrará un árbol DOM por usted. Si no se construye uno, será mucho más simple que crear y mantener las expresiones regulares que harán la misma tarea.


La expresión regular del vudú oscuro como se describe aquí funciona muy bien.
http://www.perlmonks.org/?node_id=261292
Su principal ventaja contra el uso de XML :: LibXMl y otros es que es un orden de magnitud más rápido.


De este enlace :

private static Regex indentingRegex=new Regex(@"/</s*(?<tag>[/w/-]+)(/s+[/w/-]+/s*=/s*""[^""]*""|''[^'']*'')*/s*/>[^/<]*/</s*//s*/k<tag>/s*/>|/<[!/?]((?<=!)--((?!--/>).)*--/>|(""[^""]*""|''[^'']''|[^>])*/>)|/</s*(?<closing>/)?/s*[/w/-]+(/s+[/w/-]+/s*=/s*""[^""]*""|''[^'']*'')*/s*((//s*)|(?<opening>))/>|[^/<]*", RegexOptions.ExplicitCapture|RegexOptions.Singleline); public static string IndentXml(string xml) { StringBuilder result=new StringBuilder(xml.Length*2); int indent=0; for (Match match=indentingRegex.Match(xml); match.Success; match=match.NextMatch()) { if (match.Groups["closing"].Success) indent--; result.AppendFormat("{0}{1}/r/n", new String('' '', indent*2), match.Value); if (match.Groups["opening"].Success&&(!match.Groups["closing"].Success)) indent++; } return result.ToString(); }