2010-10-21 23 views
5

Tengo un archivo de texto que contiene más o menos párrafos. El texto no es realmente palabras, sus datos delimitados por comas; pero eso no es realmente tan importante. El archivo de texto está dividido en secciones; puede haber secciones y subsecciones. La división de secciones se denota por más de una nueva línea y subsecciones por una nueva línea.C# Regex.Replace Multiple Newlines

datos de modo de ejemplo:

This is the, start of a, section 
908690,246246246,246246 
246246,246,246246 

This is, the next, section, 
sfhklj,sfhjk,4626246 
4yw2,fdhds5juj,53ujj 

lo que los datos anteriormente contiene dos secciones, cada una con tres subsecciones. A veces, sin embargo, hay más de una línea vacía entre las secciones. Cuando esto ocurre, quiero convertir los múltiples caracteres de nueva línea, digamos \n\n\n\n a solo \n\n; Creo que Regex es probablemente la manera de hacer esto. También es posible que necesite utilizar diferentes estándares de nueva línea, unix \n y Windows \r\n. Creo que los archivos probablemente contienen múltiples codificaciones finales.

Aquí está la expresión regular que he creado; no es nada especial:

Regex.Replace(input, @"([\r\n|\n]{2,})", Enviroment.NewLine + Enviroment.NewLine} 

En primer lugar, ¿es esta una buena solución de expresiones regulares? No soy tan bueno con Regex.

En segundo lugar, a continuación, desea dividir cada sección en un elemento en una matriz de cadenas:

Regex.Split(input, Enviroment.NewLine + Enviroment.NewLine) 

¿Hay una manera de combinar estos pasos?

+0

Supongo que primero debe reemplazar '([\ r \ n | \ n])' con 'Enviroment.NewLine' para mantener la coherencia de los datos. Y no sé de una manera de optimizarlo, supongo que no puedes combinarlos. Supongo que estás en el camino correcto. Es posible que desee establecer 'RegexOptions.Compiled' para hacerlo más rápido. – BrunoLM

Respuesta

6

[\r\n|\n] es incorrecto. Es un character class que coincide con uno de los caracteres \r, \n o |.

Las expresiones comunes para hacer coincidir un separador de línea genérico son (?:\r\n|[\r\n]) o (?:\n|\r\n?). Estos coincidirán con \r\n (DOS/Windows), \r (Macintosh antiguo) o \n (Unix/Linux/Mac OS X).

Me normalizar todos los separadores de línea a \n, a continuación, se dividieron en dos o más de los:

Regex.Split(Regex.Replace(source, @"(?:\r\n|[\r\n])", "\n"), @"\n{2,}") 
+0

Genial, gracias. Exactamente lo que estaba buscando. Es bueno saber que mi expresión regular estaba al menos semi en el camino correcto. – Shawn

0

sólo voy a utilizar String.Split y la primera dividir el texto en secciones utilizando nuevas líneas dobles como delimitador, a continuación, dividir cada de la sección en la subsección usando newline simple como delimitador. Luego terminará con la matriz que deseaba. Puede usar el objeto List<string> como contenedor y agregar la matriz devuelta desde el método de división usando AddRange al contenedor.