regulares regular expresiones expresion especiales espacio ejemplos cuantificadores cualquier caracteres caracter blanco alfanumerico c# regex multiline

c# - especiales - expresiones regulares ejemplos



No se puede hacer que la expresión regular funcione correctamente con multilínea (4)

El carácter regex "." nunca coincide con una nueva línea, incluso con la opción MultiLine configurada. en su lugar, debe usar [/s/S] u otra combinación con coincidencias.

La opción MultiLine solo modifica el comportamiento de ^ (begin-of-line en lugar de fo begin-of-string) y $ (end-of-line en lugar de end-of-string)

Por cierto, de hecho, la expresión regular no es la forma correcta de escanear un HTML ...

Tengo una salida XML bastante grande de una aplicación. Necesito procesarlo con mi programa y luego retroalimentarlo al programa original. Hay piezas en este XML que deben ser completadas y reemplazadas. La parte interesante se ve así:

<sys:customtag sys:sid="1" sys:type="Processtart" /> <sys:tag>value</sys:tag> here are some other tags <sys:tag>value</sys.tag> <sys:customtag sys:sid="1" sys:type="Procesend" />

y el documento contiene varias piezas como esta.

Necesito obtener todas las piezas XML dentro de estas etiquetas para poder hacer modificaciones en él. Escribí una expresión regular para obtener esas piezas, pero no funciona:

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(@"output.xml"); Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>", RegexOptions.Multiline & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant); MatchCollection matches = regExp.Matches(xmlDoc.InnerXml);

Si dejo todo el material en una línea y llamo a esta expresión regular sin la opción de línea múltiple, sí encuentra todas las ocurrencias. Al dejar el archivo tal como está y establecer la opción de líneas múltiples, no funciona. ¿Cuál es el problema? ¿Qué debería cambiar? ¿O hay alguna manera más fácil de obtener las partes XML entre estas etiquetas sin regexp?


Creo que la opción de usar es RegexOptions.Singleline lugar de RegexOptions.Multiline ( src ). permitir (.) coincidir con nuevas líneas debería funcionar en su caso.

... el modo donde el punto también coincide con las nuevas líneas se llama "modo de línea única". Esto es un poco desafortunado, porque es fácil mezclar este término con "modo multilínea". El modo multilínea solo afecta a los anclajes, y el modo de línea única solo afecta al punto ... Al usar las clases regex del .NET framework, activa este modo especificando RegexOptions.Singleline, como en Regex.Match ("cadena "," regex ", RegexOptions.Singleline).


RegExp es una herramienta deficiente para xml ... ¿no podría cargarlo en un XDocument / XmlDocument y usar xpath? Si clarifica las modificaciones que desea realizar, espero que podamos completar los espacios en blanco ... los espacios de nombres son probablemente lo principal para hacerlo complejo en este caso, así que solo necesitamos usar un XmlNamespaceManager .

Aquí hay un ejemplo que se concede, más complejo que solo una expresión regular, sin embargo, espero que se adapte mucho mejor a los matices de xml:

string xml = @"<foo xmlns:sys=""foobar""><bar/><bar><sys:customtag sys:sid=""1"" sys:type=""Processtart"" /> <sys:tag>value</sys:tag> here are some other tags <sys:tag>value</sys:tag> <sys:customtag sys:sid=""1"" sys:type=""Procesend"" /></bar><bar/></foo>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable()); mgr.AddNamespace("sys", "foobar"); var matches = doc.SelectNodes("//sys:customtag[@sys:type=''Processtart'']", mgr); foreach (XmlElement start in matches) { XmlElement end = (XmlElement) start.SelectSingleNode("following-sibling::sys:customtag[@sys:type=''Procesend''][1]",mgr); XmlNode node = start.NextSibling; while (node != null && node != end) { Console.WriteLine(node.OuterXml); node = node.NextSibling; } }


Si sigues teniendo problemas con esto, puede deberse a que estás usando Y con tus RegexOptions en lugar de O.

Este código es incorrecto y pasará cero como el segundo parámetro al constructor:

Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>", RegexOptions.Multiline & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant);

Este código es correcto (en cuanto al uso de múltiples indicadores de RegexOptions):

Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.CultureInvariant);