Come rimuovere i nuovi caratteri di linea da una stringa?


181

Ho una stringa nel seguente formato

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

Voglio rimuovere tutte le occorrenze di \ne \rdalla stringa sopra.

Ho provato string s = s.Trim(new char[] {'\n', '\r'});ma non ha aiutato.

Risposte:


321

Mi piace usare le espressioni regolari. In questo caso potresti fare:

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

Le espressioni regolari non sono così popolari nel mondo .NET come nei linguaggi dinamici, ma forniscono molta potenza per manipolare le stringhe.


Questa è stata sicuramente la soluzione migliore per me. Una semplice combinazione di questo C # e javascript era tutto ciò di cui avevo bisogno per risolvere il mio problema.
Joe Brunscheon,

Ho avuto un problema simile in cui dovevo anche rimuovere le nuove righe dalla mia stringa. Ho provato a farlo con lo string. Sostituisci, non ha funzionato. Quando ho usato Regex.Replace con la stessa stringa di espressioni regolari del parametro, ha funzionato. Grazie.
esempio del

8
Fai attenzione se lo usi in un ciclo che elabora 1M + elementi. Regex è molto più lento di String.Replace
Nick,

L'esempio di codice rimuove anche le schede \ t, che non è in discussione.
Michael Freidgeim,

71

Si desidera utilizzare String.Replaceper rimuovere un personaggio.

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

Nota che String.Trim(params char[] trimChars)rimuove solo i caratteri iniziali e finali intrimChars dall'istanza invocata.

È possibile creare un metodo di estensione, che evita i problemi di prestazioni di cui sopra creando molte stringhe temporanee:

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
Si noti che questo approccio creerà due oggetti stringa intermedi. A seconda della dimensione della stringa, ciò potrebbe comportare prestazioni significative e conseguenze sul consumo di memoria.
cdhowie,

40

So che questo è un vecchio post, tuttavia ho pensato di condividere il metodo che uso per rimuovere i nuovi caratteri di linea.

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

Riferimenti:

Metodo MSDN String.Replace e proprietà MSDN Environment.NewLine


piacevole per il supporto Mono
Nick,

1
Nell'applicazione cross-environment (ovvero l'app di Windows che viene alimentata con i dati dal sistema Unix) questo causerà più problemi che profitti.
Jakub Szułakiewicz,

15

Se la velocità e l'utilizzo di memoria insufficiente sono importanti, fare qualcosa del genere:

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ì, ci andrei anch'io (con un metodo di estensione). Sempre buono da usare StringBuilder. +1
RPM1984,

4
"Sempre bravo a usare StringBuilder" <Non sono un professionista, ma non è strettamente vero. Questo articolo di Jeff Atwood fornisce una visione divertente della manipolazione / concatenazione delle stringhe e, in definitiva, dell'ottimizzazione.
Phil Cooper,

5

fallo e basta

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

3

Un approccio 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
Questo sta usando il sovraccarico generico string.Joinche chiamerà ToStringsu ogni charrestituito dalla query. Meglio semplicemente passare i risultati della query al stringcostruttore. s1 = new string(s.Where(....).ToArrary());
juharr

0

La scelta giusta dipende davvero da quanto è grande la stringa di input e quali sono i requisiti di memoria e perforce, ma vorrei usare un'espressione regolare come

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

O se dobbiamo applicare la stessa sostituzione più volte, è meglio usare una versione compilata per il Regex come

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

NOTA: scenari diversi richiedono approcci diversi per ottenere le migliori prestazioni e il minimo consumo di memoria


0

Beh ... vorrei che tu comprendessi aree più specifiche dello spazio. \tè in realtà assortito come uno spazio orizzontale, non uno spazio verticale. (prova l'inserimento\t nel Blocco note)

Se usi Java, usa semplicemente \v. Vedi il riferimento sotto.

\h - Un carattere spazio bianco orizzontale:

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

\v - Un carattere spazio bianco verticale:

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

Ma sono consapevole che usi .NET. Quindi la mia risposta alla sostituzione di ogni spazio verticale è ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

Sembra una risposta a qualche altra domanda ... e manca anche un riferimento reale ...
Alexei Levenkov,

-4

È possibile utilizzare Trimse si desidera rimuovere dall'inizio e dalla fine.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

Cordiali saluti,

Trim () lo fa già.

Il seguente esempio LINQPad:

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

Uscite:

23
18

5
Ciò non rimuove il \ n nel mezzo.
FlappySocks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.