¿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ó.

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.


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();
}

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


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();

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);

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'));

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


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]", "");

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();

-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

55
Eso no elimina el \ n en el medio.
FlappySocks
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.