Qual è il modo più semplice in C # per tagliare una nuova riga da una stringa?


115

Voglio assicurarmi che _content non termini con un carattere NewLine:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

ma il codice sopra non funziona poiché Trim sembra non avere un parametro sovraccarico per una raccolta di stringhe, solo caratteri.

Qual è la riga più semplice per rimuovere un Enivronment.Newline dall'estremità di una stringa?


4
a proposito, probabilmente vorrai TrimEnd
Marc Gravell

Risposte:


260

Quanto segue funziona per me.

sb.ToString().TrimEnd( '\r', '\n' );

o

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

molto conciso e si occupa del problema \ r \ n, simpatico
Edward Tanguay

1
Pur tagliando QUALSIASI combinazione di caratteri che compongono una nuova riga char (s) risolve il problema sottostante e lo spirito della domanda, lascia anche un potenziale per funzionalità indesiderate in senso generale. In un senario di elaborazione di file ho potuto vedere la necessità di lasciare il primo \ n intatto in una stringa di HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Sebbene sia più prolissa, la risposta di John Skeet è probabilmente la migliore e ReadLine di Scott Weinstein è anche più "accurata" (anche se forse con un po 'più di overhead)
b_levitt

26
TrimEnd () sta già eseguendo il lavoro senza alcun parametro! msdn.microsoft.com/de-de/library/… e msdn.microsoft.com/de-de/library/…
Markus

3
@Markus Grazie ho trovato questo perché non voglio questo comportamento ma lo stavo vivendo. Avevo l'impressione \ n non fosse uno spazio bianco ma lo è e .TrimEnd e .Trim cancellano tutti i caratteri dello spazio bianco in modo nativo
David Carrigan

39

.Trim()rimuove \r\nper me (utilizzando .NET 4.0).


14

Che ne dite di:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

È un po 'inefficiente se ci sono più newline, ma funzionerà.

In alternativa, se non ti dispiace tagliare (ad esempio) "\r\r\r\r"o "\n\n\n\n"piuttosto che semplicemente "\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}

1
Probabilmente la soluzione più accurata, ma non una battuta :-)
bang

9

Usa il Framework. Il metodo ReadLine () ha quanto segue da dire:

Una riga è definita come una sequenza di caratteri seguita da un avanzamento riga ("\ n"), un ritorno a capo ("\ r") o un ritorno a capo immediatamente seguito da un avanzamento riga ("\ r \ n"). La stringa restituita non contiene il ritorno a capo o l'avanzamento riga di terminazione.

Quindi quanto segue farà il trucco

_content = new StringReader(sb.ToString()).ReadLine();

1
Elegante sì, ma non di facile comprensione per gli altri che leggono questa riga. Ha bisogno di un commento esplicativo (sulla stessa linea ovviamente per rimanere un one-liner :))
gumo

1
Non quando la stringa ha più di una riga e si desidera rimuovere solo l'ultima riga vuota.
Florian Berger

6

Che dire

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

Questo non fa esattamente la stessa cosa: ad esempio
taglierà

1
Dichiaralo come caratteristica :-) Mi piace la soluzione.
Stefan Steinegger

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Questo ovviamente rimuoverà "\ r \ r \ r \ r" così come "\ n \ n \ n \ n" e altre combinazioni. E negli "ambienti" dove NewLine è diverso da "\ n \ r" potresti avere dei comportamenti strani :-)

Ma se riesci a convivere con questo, credo che questo sia il modo più efficace per rimuovere i nuovi caratteri di riga alla fine di una stringa.


3

Che ne dici di:

string text = sb.ToString().TrimEnd(null)

Ciò estrarrà tutti i caratteri di spazio bianco dalla fine della stringa - solo un problema se si desidera preservare gli spazi bianchi non di nuova riga.


1

Un po 'una non risposta, ma il modo più semplice per tagliare una nuova riga da una stringa è di non avere la nuova riga sulla stringa in primo luogo, assicurandoti che non sia mai vista dal tuo codice. Cioè, usando le funzioni native che rimuovono la nuova riga. Molti metodi stream e file / io non includeranno la nuova riga se chiedi l'output riga per riga, sebbene potrebbe essere necessario racchiudere qualcosa in un file System.IO.BufferedStream.

Cose come System.IO.File.ReadAllLinespossono essere utilizzate al posto della System.IO.File.ReadAllTextmaggior parte delle volte e ReadLinepossono essere utilizzate al posto di Readuna volta che si lavora con il giusto tipo di flusso (ad esempio BufferedStream).


0

Come ha sottolineato Markus, TrimEnd sta facendo il lavoro ora. Avevo bisogno di ottenere avanzamenti riga e spazio bianco da entrambe le estremità della stringa in ambiente Windows Phone 7.8. Dopo aver cercato diverse opzioni più complesse, il mio problema è stato risolto utilizzando solo Trim () - ha superato bene i seguenti test

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }

-2

Ho dovuto rimuovere le nuove righe in tutto il testo. Quindi ho usato:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

1
Questo sarà un disastro se il testo contiene NewLine che non è alla fine.
Stefan Bergfeldt
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.