¿Cuál es la forma más rápida de eliminar varias líneas vacías?

Recibo un mensaje de cadena a través de un evento y lo estoy poniendo en un TextBox. Desafortunadamente, este mensaje tiene muchas líneas vacías. ¿Cómo reemplazo dos líneas vacías por una?

Mi primer pensamiento es algo como esto:

string newLine = Environment.NewLine;
textbox.text = msg.Replace(newLine + newLine, newLine);

Estoy seguro de que hay una mejor manera de lograrlo.

preguntado el 08 de noviembre de 11 a las 19:11

Me preocuparía que la cadena no tenga necesariamente Environment.NewLine como su nueva línea. Por eso, iría con la respuesta de @ Moo-Juice. -

6 Respuestas

Podrías usar RegEx.Replace.

De hecho, el artículo de MSDN sobre esa función muestra cómo deshacerse de demasiado espacio en blanco, está muy cerca de lo que quiere hacer:

http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx

Sin embargo, para sus propósitos, en lugar de buscar espacios en blanco:

"\\s+";

Quieres buscar nuevas líneas:

"\\n+";

respondido 08 nov., 11:23

Or @"\n+" así que escapar no es una preocupación. - user7116

Agradable, pero la expresión regular es realmente lenta. odys

@odyodyodys, si hay un notable e inaceptable ralentización de su programa y se demostró que era este soltero rutina, de lo que yo recomendaría un método diferente. No siempre se debe pensar en términos de velocidad hasta que realmente sea un problema. :) - Moo-Juice

¿Qué tal aprovechar string.Split() con la opción RemoveEmptyEntries:

message = string.Join(Environment.NewLine, message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));

Esto también cubriría más de dos nuevas líneas seguidas en lugar de solo dos.

respondido 08 nov., 11:23

Pero tu String.Replace La solución no funcionará si hay tres líneas nuevas seguidas. Por ejemplo, considere:

string s = "hello\n\n\n\n\n\n\n\n\n\n\n\nworld";
string s1 = s.Replace("\n\n", "\n");
string s2 = Regex.Replace(s, "\\n{2,}", "\n");

s1 tendrá múltiples \n personajes en ella. s2 tendrá solo uno.

Esto esta usando \n como ejemplo, pero lo mismo se aplica si está utilizando Environment.NewLine (es decir \r\n).

respondido 08 nov., 11:23

textbox.text = Regex.Replace(inputText, @"(" + Environment.NewLine + ")+", Environment.NewLine); debería hacer el truco

respondido 08 nov., 11:23

Debe usar Environment.NewLine ya que esta no es una línea nueva para todos los sistemas. Puede ser (como en mi situación) \r\n - odys

Podría usar una expresión regular, pero luego tiene dos problemas. Su código es más simple: use String.Replace.

respondido 08 nov., 11:23

Me gusta la referencia de Zawinski allí :) - neeKo

No soy un gran fanático de las expresiones regulares, pero tienen su lugar. Este es uno de ellos. No hay forma de saberlo StringReplace "convertir dos o más líneas nuevas en una sola línea nueva". - Jim Mischel

Sí es cierto. Quería obtener la respuesta rápidamente y seguir adelante para trabajar un poco, pero la sugerencia original solo reemplazaría 2 por 1, no n por 1. - Patrick Szalapski

Esto supone dos cosas.

1) El carácter de nueva línea que está intentando reemplazar es el carácter de nueva línea de Windows y diga el carácter de nueva línea de Unix.

2) Que solo desea reemplazar las instancias en las que ocurre "nueva línea + nueva línea" y no "nueva línea + nueva línea + nueva línea", que entonces sería como "nueva línea + nueva línea". Recuerde String.Replace crea una nueva cadena.

En otras palabras, tu idea es errónea.

Sugiero leer esto: http://www.dotnetperls.com/remove-whitespace

respondido 08 nov., 11:23

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.