Sostituisci le interruzioni di riga in una stringa C #


512

Come posso sostituire le interruzioni di riga all'interno di una stringa in C #?


2
Per favore, dicci di più: cos'è una "interruzione di riga" per te? Con cosa vuoi sostituirli?
Jay Bazuzi,

ah ah. Stavo controllando lo stesso per java quando ho scoperto System.getProperty ("line.separator") era curioso di conoscere la controparte in C #. il tuo post mi ha aiutato.
Ravisha,

Risposte:


715

Usa sostituisci con Environment.NewLine

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

Come menzionato in altri post, se la stringa proviene da un altro ambiente (SO), è necessario sostituire l'implementazione di quegli ambienti particolari di nuovi caratteri di controllo di linea .


8
Innanzitutto non ha funzionato per me. Dopo alcune ricerche, ho trovato la soluzione: ho dovuto usare 'using System;' o "System.Environment.NewLine"
Smolla,

12
Non rimosso tutti i caratteri newline. Prova questa stringa "\ n \ r \ nIl mio messaggio \ r \ n \ n \ r \ n è questo. \ N \ n \ r \ n"
Shakti Prakash Singh

13
In generale, mi piace questa soluzione. Tuttavia, si noti che anche sullo stesso sistema operativo, le nuove righe potrebbero non corrispondere. Questo mi è successo perché l'elaborazione ha restituito SQL. Le nuove linee erano \ n, mentre Environment.NewLine era \ r \ n. Il risultato è stato che nulla è stato abbinato, quindi sono rimaste le nuove linee.
Dono,

@Dono> da dove provengono i dati SQL? Probabilmente da una fonte esterna che si occupa di nuove linee nel modo UNIX. Questo è un problema con il formato dei dati, non con il sistema operativo o questo metodo ...
Laurent S.

Questo dovrebbe essere uno dei metodi statici della classe String. .NET stesso dovrebbe essere in grado di rilevare il formato delle interruzioni di riga di origine in una stringa e convertirlo in formato Environment.NewLine \ r \ n ...
Dean Kuga,

442

Le soluzioni pubblicate finora possono sostituire Environment.NewLineo falliscono solo se la stringa di sostituzione contiene interruzioni di linea perché chiamano string.Replacepiù volte.

Ecco una soluzione che utilizza un'espressione regolare per effettuare tutte e tre le sostituzioni in un solo passaggio sulla stringa. Ciò significa che la stringa di sostituzione può contenere in modo sicuro interruzioni di riga.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
quindi il tuo detto facendo Regex.Replace (input, @ "[\ r \ n] +", sostituzioneString) non compirebbe lo stesso compito?
flamebaud,

7
@flamebaud No, ciò produrrebbe un risultato diverso se ci fossero più interruzioni di riga in una riga. "\ r \ n? | \ n" sostituirà ogni interruzione di riga mentre "[\ r \ n] +" eseguirà una singola sostituzione per qualsiasi numero di interruzioni di riga.
David Hammond,

Per coloro che sono preoccupati per le interruzioni di più righe: / (\ r \ n? | \ N) / gm
BobbyA

4
Questa è in realtà la soluzione corretta se si desidera rimuovere l'interruzione di riga in una stringa che potrebbe provenire da diversi sistemi operativi. Un buon esempio è la formattazione JSON. +1
Bastien Vandamme,

1
Se la stringa testuale (prefisso @) non viene utilizzata, allora dovresti avere due barre rovesciate di fila ovunque sia usata, quindi la risposta di @mark_byers sopra è ancora corretta. Il prefisso @ fa sì che la barra rovesciata faccia parte della stringa che deve essere per Regex usarla come carattere di escape.
Kirk Liemohn,

173

Per estendere la risposta di The.Anyi.9, dovresti anche essere consapevole dei diversi tipi di interruzione di linea in uso generale . A seconda di dove è stato originato il tuo file, potresti voler assicurarti di catturare tutte le alternative ...

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

dovresti farti andare ...


6
All'inizio mi piaceva di più l'ambiente, ma se String non proviene dal sistema su cui è in esecuzione, non funzionerà. +1
Flo

1
non è Line.Replace("\n", replaceWith).Replace("\r", replaceWith);abbastanza?
Thomas Ayoub,

5
No, perché se lo \r\nhai finirai con la stringa di sostituzione due volte - non è l'ideale.
ZombieSheep,

1
Non hai bisogno di letterali stringa? string removeBreaks = Line.Replace (@ "\ r \ n", sostituisci con). Sostituisci (@ "\ n", sostituisci con). Sostituisci (@ "\ r", sostituisci con);
Shawn Dotey,

2
@ShawnDotey non è necessario, vogliamo sostituire i caratteri di controllo, non le sequenze di barra rovesciata e lettera.
N. Kudryavtsev,

38

Vorrei utilizzare Environment.Newline quando volevo inserire una nuova riga per una stringa, ma non rimuovere tutte le nuove righe da una stringa.

A seconda della tua piattaforma puoi avere diversi tipi di newline, ma anche all'interno della stessa piattaforma vengono spesso utilizzati diversi tipi di newline. In particolare quando si tratta di formati di file e protocolli.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

Questa è l'unica cosa che ha funzionato per me quando volevo comprimere un codice di pagina Web recuperato su una singola riga (per rendere più semplici i modelli regex).
Paw Baltzersen,

Totalmente d'accordo con Brian R. Bondy. La soluzione offerta da Corin e votata così tanto è molto ingenua, almeno.
Califf

18

Se si suppone che il codice venga eseguito in ambienti diversi, prenderei in considerazione l'utilizzo della Environment.NewLinecostante, poiché è specificamente newlineutilizzata nell'ambiente specifico.

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

Tuttavia, se si ottiene il testo da un file che ha origine su un altro sistema, questa potrebbe non essere la risposta corretta e si dovrebbe sostituire con qualsiasi costante newline utilizzata sull'altro sistema. In genere sarà \no \r\n.


È necessario riassegnarlo nuovamente alla variabile originale poiché la sostituzione non avviene in posizione.
tvanfosson,

@driss Vorrei sapere come sceglieresti una nuova costante di linea corretta quando non hai idea di quale sistema provenga un file ... questa soluzione sembra davvero UNIVERSALE.
Califf

14

Non dimenticare che sostituisci non esegue la sostituzione nella stringa, ma restituisce una nuova stringa con i caratteri sostituiti. Quanto segue rimuoverà le interruzioni di riga (non le sostituirà). Userei il metodo di @Brian R. Bondy se li sostituissi con qualcos'altro, forse avvolto come metodo di estensione. Ricordarsi di controllare i valori null prima di chiamare Sostituisci o i metodi di estensione forniti.

string line = ...

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

Come metodi di estensione:

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

non può avere ''in C # - non esiste un carattere vuoto. sarà '\0'lavoro, invece?
Shevek,

1
@Shevek - ho appena usato le virgolette sbagliate. Devo aver fatto un bel po 'di javascript il giorno in cui ho risposto.
tvanfosson,

@Califf: è equivalente, non migliore.
tvanfosson,

2
l'errore che hai fatto qui dimostra solo che è meglio. La maggior parte delle aziende per cui ho lavorato hanno il loro standard di codifica - NON UTILIZZARE LETTERI HARDCODED.
Califf

2
@Califf l '"errore" che ho fatto non sarebbe stato fatto in un IDE con Intellisense né sarebbe stato compilato. Se ritieni che string.Emptysia meglio, usalo sicuramente.
Tvanfosson,

10

Per assicurarsi che vengano sostituiti tutti i modi possibili di interruzioni di riga (Windows, Mac e Unix) è necessario utilizzare:

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

e in questo ordine, per non fare ulteriori interruzioni di riga, quando trovi una combinazione di caratteri di fine riga.


8

se vuoi "ripulire" le nuove linee, commentare con flamebaud usando regex @"[\r\n]+"è la scelta migliore.

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
  }
}

La migliore risposta per sostituire nuove linee, nella maggior parte dei casi.
Shahbaz Ahmad,

Grazie per questo utile codice di esempio. Mi è stato risolto tramite questo sytnax: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu

6

Ho dovuto sostituire il \r\ncon un ritorno a capo e un avanzamento riga \teffettivi e sostituirli con una scheda effettiva. Quindi ho pensato a quanto segue:

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

6

Perché non entrambi?

string ReplacementString = "";

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

Nota: sostituire strincon il nome della stringa di input.


4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);

2

Utilizzare il metodo .Replace ()

Line.Replace("\n", "whatever you want to replace with");

2

Il modo migliore per sostituire le interruzioni di linea in modo sicuro è

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

che dovrebbe produrre una stringa con solo \ n (es. avanzamento riga) come interruzioni di riga. questo codice è utile anche per correggere interruzioni di riga miste.


2

Come nuova linea possono essere delimitati da \n, \re \r\n, prima ci sostituiamo \re \r\ncon \n, e solo stringa di dati poi diviso.

Le seguenti righe dovrebbero andare al parseCSVmetodo:

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

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

o

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

a seconda del modo in cui vuoi andare.

Spero che sia d'aiuto.


0

Un'altra opzione è quella di creare un StringReaderover la stringa in questione. Sul lettore, esegui .ReadLine()un ciclo. Quindi hai le linee separate, indipendentemente dai separatori (coerenti o incoerenti) che avevano. Con ciò, puoi procedere come desideri; una possibilità è usare un StringBuildere chiamarlo .AppendLine.

Il vantaggio è che si lascia decidere al framework cosa costituisce una "interruzione di linea".


0

Se si desidera sostituire solo le nuove righe:

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

Se si desidera sostituire nuove righe, schede e spazi bianchi:

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