¿Cómo eliminar nuevos caracteres de línea de una cadena?

181

Tengo una cadena en el siguiente formato

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

Quiero eliminar todas las ocurrencias de \ny \rde la cadena de arriba.

Lo intenté string s = s.Trim(new char[] {'\n', '\r'});pero no ayudó.

Ashish Ashu
fuente

Respuestas:

321

Me gusta usar expresiones regulares. En este caso podrías hacer:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

Las expresiones regulares no son tan populares en el mundo .NET como lo son en los lenguajes dinámicos, pero brindan mucho poder para manipular cadenas.

Iglesia
fuente
Esta fue definitivamente la mejor solución para mí. Una combinación suave de este C # y javascript fue todo lo que necesitaba para resolver mi problema.
Joe Brunscheon el
Tuve un problema similar en el que también necesitaba eliminar nuevas líneas de mi cadena. Traté de hacerlo con una cadena. Reemplazar, no funcionó. Cuando utilicé Regex.Replace con exactamente la misma cadena de expresión regular que el parámetro, funcionó. Gracias.
instancia del
8
Tenga cuidado si usa esto en un bucle que procesa elementos 1M +. Regex es mucho más lento que solo String
Nick
El ejemplo de código también elimina pestañas \ t, que no está en cuestión.
Michael Freidgeim
71

Desea utilizar String.Replacepara eliminar un personaje.

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

Tenga en cuenta que String.Trim(params char[] trimChars)solo elimina los caracteres iniciales y finales trimCharsde la instancia invocada en.

Podría hacer un método de extensión, que evite los problemas de rendimiento de lo anterior de hacer muchas cadenas temporales:

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}
jason
fuente
8
Tenga en cuenta que este enfoque creará dos objetos de cadena intermedios. Dependiendo del tamaño de su cadena, esto podría tener consecuencias significativas en el rendimiento y el consumo de memoria.
cdhowie
40

Sé que esta es una publicación antigua, sin embargo, pensé en compartir el método que uso para eliminar nuevos caracteres de línea.

s.Replace(Environment.NewLine, "");

Referencias

MSDN String.Replace Method y MSDN Environment.NewLine Property

ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
fuente
agradable para soporte Mono
Nick
1
En la aplicación de entornos cruzados (es decir, la aplicación de Windows que se alimenta con datos del sistema Unix), esto causará más problemas que ganancias.
Jakub Szułakiewicz
15

Si la velocidad y el bajo uso de memoria son importantes, haga algo como esto:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();
cdhowie
fuente
Sí, iría con esto también (en un método de extensión). Siempre es bueno usar StringBuilder. +1
RPM1984
44
"Siempre es bueno usar el StringBuilder" <No soy profesional, pero eso no es estrictamente cierto. Este artículo de Jeff Atwood proporciona una visión divertida de la manipulación / concatenación de cadenas y, en última instancia, la optimización.
Phil Cooper
5

solo haz eso

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
Mahmoud ElMansy
fuente
3

Un enfoque LINQ:

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));
wb
fuente
1
Esto está utilizando la sobrecarga genérica de string.Joinque invocará ToStringcada uno chardevuelto por la consulta. Es mejor simplemente pasar los resultados de la consulta al stringconstructor. s1 = new string(s.Where(....).ToArrary());
juharr
0

La elección correcta realmente depende de qué tan grande es la cadena de entrada y cuáles son los requisitos de rendimiento y memoria, pero usaría una expresión regular como

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

O si necesitamos aplicar el mismo reemplazo varias veces, es mejor usar una versión compilada para Regex como

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

NOTA: diferentes escenarios requieren diferentes enfoques para lograr el mejor rendimiento y el consumo mínimo de memoria

kalitsov
fuente
0

Bueno ... me gustaría que entendieras áreas más específicas del espacio. \ten realidad se clasifica como un espacio horizontal, no un espacio vertical. (prueba de inserción \ten el Bloc de notas)

Si usa Java, simplemente use \v. Ver la referencia a continuación.

\h - Un carácter de espacio en blanco horizontal:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - Un carácter de espacio en blanco vertical:

[\n\x0B\f\r\x85\u2028\u2029]

Pero sé que usas .NET. Entonces mi respuesta para reemplazar cada espacio vertical es ...

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
Kang Andrew
fuente
Parece una respuesta a alguna otra pregunta ... y también falta una referencia real ...
Alexei Levenkov
-4

Puede usar Trimsi desea eliminar desde el inicio y el final.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();
Ankit Arya
fuente
-6

FYI

Trim () ya lo hace.

El siguiente ejemplo de LINQPad:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

Salidas:

23
18
lnaie
fuente
55
Eso no elimina el \ n en el medio.
FlappySocks