Reemplazar saltos de línea en una cadena C #

512

¿Cómo puedo reemplazar saltos de línea dentro de una cadena en C #?

YonahW
fuente
2
Cuéntanos más: ¿qué es un "salto de línea" para ti? ¿Con qué quieres reemplazarlos?
Jay Bazuzi
ja ja. Estaba comprobando lo mismo en Java cuando descubrí que System.getProperty ("line.separator") tenía curiosidad por saber la contraparte en C #. Tu publicación me ayudó.
Ravisha

Respuestas:

715

Usar reemplazar con Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

Como se mencionó en otras publicaciones, si la cadena proviene de otro entorno (SO), entonces deberá reemplazar esa implementación de entornos particulares de nuevos caracteres de control de línea .

Corin Blaikie
fuente
8
Primero no funcionó para mí. Después de investigar un poco, encontré la solución: tenía que usar 'usar el sistema'; o 'System.Environment.NewLine'
Smolla
12
No eliminó todos los caracteres de nueva línea. Pruebe esta cadena "\ n \ r \ nMi mensaje \ r \ n \ n \ r \ n es esto. \ N \ n \ r \ n"
Shakti Prakash Singh
13
En general, me gusta esta solución. Sin embargo, tenga en cuenta que incluso en el mismo sistema operativo, las nuevas líneas reales pueden no coincidir. Esto me sucedió por qué el procesamiento devolvió SQL. Las nuevas líneas eran \ n, mientras que Environment.NewLine era \ r \ n. El resultado fue que nada coincidía, por lo que las nuevas líneas permanecieron.
Dono
@Dono> ¿de dónde provienen los datos SQL? Probablemente de una fuente externa que se ocupa de nuevas líneas a la manera UNIX. Eso es un problema con el formato de datos, no con el sistema operativo o este método ...
Laurent S.
Este debería ser uno de los métodos estáticos de la clase String. .NET sí mismo debería ser capaz de detectar el formato de los saltos de línea de origen en una cadena y convertirla en Environment.NewLine \ r \ n formato ...
Dean Kuga
442

Las soluciones publicadas hasta ahora solo reemplazan Environment.NewLine o fallan si la cadena de reemplazo contiene saltos de línea porque llaman string.Replacevarias veces.

Aquí hay una solución que usa una expresión regular para hacer los tres reemplazos en una sola pasada sobre la cadena. Esto significa que la cadena de reemplazo puede contener saltos de línea de forma segura.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Mark Byers
fuente
3
¿Entonces su dicho haciendo Regex.Replace (input, @ "[\ r \ n] +", replaceString) no lograría la misma tarea?
flamebaud
77
@flamebaud No, eso produciría un resultado diferente si hay múltiples saltos de línea seguidos. "\ r \ n? | \ n" reemplazaría cada salto de línea, mientras que "[\ r \ n] +" haría un reemplazo simple para cualquier número de saltos de línea.
David Hammond
Para aquellos preocupados por los saltos de línea múltiples: / (\ r \ n? | \ N) / gm
BobbyA
44
Esta es realmente la solución correcta si desea eliminar el salto de línea en una cadena que puede provenir de un sistema operativo diferente. Un buen ejemplo es el formato JSON. +1
Bastien Vandamme
1
Si no se usa la cadena literal (prefijo @), entonces necesitaría tener dos barras invertidas en una fila en todas partes, por lo que la respuesta de @mark_byers anterior sigue siendo correcta. El prefijo @ hace que la barra diagonal inversa sea parte de la cadena que debe ser para que Regex lo use como el carácter de escape.
Kirk Liemohn
173

Para ampliar la respuesta de The.Anyi.9, también debe tener en cuenta los diferentes tipos de salto de línea en el uso general . Dependiendo de dónde se originó su archivo, es posible que desee ver para asegurarse de tomar todas las alternativas ...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

debería ponerte en marcha ...

ZombiOvejas
fuente
66
Primero, me gustó más el entorno, pero si el String no proviene del sistema en el que se ejecuta, no funcionará. +1
Flo
1
no es Line.Replace("\n", replaceWith).Replace("\r", replaceWith);suficiente?
Thomas Ayoub
55
No, porque si lo tiene \r\n, terminará con la cadena de reemplazo dos veces, lo que no es ideal.
ZombieSheep
1
¿No necesitas literales de cadena? cadena eliminadaBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey
2
@ShawnDotey no es necesario, queremos reemplazar los caracteres de control, no las secuencias de barra invertida y letra.
N. Kudryavtsev
38

Usaría Environment.Newline cuando quisiera insertar una nueva línea para una cadena, pero no eliminar todas las nuevas líneas de una cadena.

Dependiendo de su plataforma, puede tener diferentes tipos de nuevas líneas, pero incluso dentro de la misma plataforma, a menudo se utilizan diferentes tipos de nuevas líneas. En particular cuando se trata de formatos de archivo y protocolos.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Brian R. Bondy
fuente
Esto es lo único que funcionó para mí cuando quería colapsar un código de página web recuperado en una sola línea (para facilitar los patrones de expresiones regulares).
Paw Baltzersen
Totalmente de acuerdo con Brian R. Bondy. La solución ofrecida por Corin y tan votada es muy ingenua, al menos.
Califf
18

Si se supone que su código se ejecuta en diferentes entornos, consideraría usar la Environment.NewLineconstante, ya que es específicamente la newlineutilizada en el entorno específico.

line = line.Replace(Environment.NewLine, "newLineReplacement");

Sin embargo, si obtiene el texto de un archivo que se origina en otro sistema, esta podría no ser la respuesta correcta, y debe reemplazarla con cualquier constante de nueva línea que se use en el otro sistema. Normalmente será \no \r\n.

driis
fuente
Debe reasignarlo nuevamente a la variable original ya que el reemplazo no ocurre en su lugar.
tvanfosson
@driss Me gustaría saber cómo elegiría una constante de línea nueva correcta cuando no tiene idea de qué sistema proviene un archivo ... esta solución realmente parece ser UNIVERSAL.
Califf
14

No olvide que reemplazar no hace el reemplazo en la cadena, sino que devuelve una nueva cadena con los caracteres reemplazados. Lo siguiente eliminará los saltos de línea (no los reemplazará). Usaría el método de @Brian R. Bondy si los reemplazara con otra cosa, tal vez envuelto como un método de extensión. Recuerde verificar primero los valores nulos antes de llamar a Reemplazar o los métodos de extensión provistos.

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

Como métodos de extensión:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}
tvanfosson
fuente
no se puede tener ''en C #: no existe un carácter vacío. se '\0'trabajará en su lugar?
Shevek
1
@Shevek: acabo de utilizar las comillas incorrectas. Debe haber estado haciendo una buena cantidad de javascript el día que respondí esto.
tvanfosson
@Califf: es equivalente, no mejor.
tvanfosson
2
el error que cometiste aquí solo prueba que ES mejor. La mayoría de las empresas para las que trabajé tienen su estándar de codificación: NO UTILICE LITERALES CODIFICADOS.
Califf
2
@Califf el "error" que cometí no se habría realizado en un IDE con Intellisense ni se habría compilado. Si crees que eso string.Emptyes mejor, utilízalo.
tvanfosson
10

Para asegurarse de que se reemplacen todas las formas posibles de saltos de línea (Windows, Mac y Unix), debe usar:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

y en este orden, para no hacer saltos de línea adicionales, cuando encuentre alguna combinación de caracteres de final de línea.

Dominik Szymański
fuente
8

si desea "limpiar" las nuevas líneas, el comentario flamebaud usando regex @"[\r\n]+"es la mejor opción.

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}
ewwink
fuente
La mejor respuesta para reemplazar nuevas líneas, en la mayoría de los casos.
Shahbaz Ahmad
Gracias por este útil código de muestra. Me arreglaron a través de esta sintaxis: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu
6

Necesitaba reemplazar el \r\ncon un retorno de carro real y avance de línea y reemplazar \tcon una pestaña real. Entonces se me ocurrió lo siguiente:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}
Zamir
fuente
6

¿Por qué no los dos?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

Nota: Reemplace strincon el nombre de su cadena de entrada.

RAYO
fuente
4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Matt Hinze
fuente
2

Use el método .Replace ()

Line.Replace("\n", "whatever you want to replace with");
The.Anti.9
fuente
2

La mejor manera de reemplazar saltos de línea de forma segura es

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

eso debería producir una cadena con solo \ n (por ejemplo, salto de línea) como saltos de línea. Este código también es útil para corregir saltos de línea mixtos.

datos
fuente
2

Como una nueva línea puede delimitarse por \n, \ry \r\n, primero reemplazaremos \ry \r\npor \n, y solo luego dividiremos la cadena de datos.

Las siguientes líneas deberían ir al parseCSVmétodo:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}
Amrik
fuente
0
string s = Regex.Replace(source_string, "\n", "\r\n");

o

string s = Regex.Replace(source_string, "\r\n", "\n");

dependiendo de qué camino quieres ir.

Espera que ayude.


fuente
0

Otra opción es crear un StringReadersobre la cadena en cuestión. En el lector, hazlo .ReadLine()en un bucle. Luego tiene las líneas separadas, sin importar qué separadores (consistentes o inconsistentes) tengan. Con eso, puede proceder como lo desee; una posibilidad es usar un StringBuildery recurrir .AppendLinea él.

La ventaja es que permite que el marco decida qué constituye un "salto de línea".

Jeppe Stig Nielsen
fuente
0

Si desea reemplazar solo las líneas nuevas:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

Si desea reemplazar nuevas líneas, pestañas y espacios en blanco:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
Tadej
fuente