Come posso sostituire le interruzioni di riga all'interno di una stringa in C #?
Come posso sostituire le interruzioni di riga all'interno di una stringa in C #?
Risposte:
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 .
Le soluzioni pubblicate finora possono sostituire Environment.NewLine
o falliscono solo se la stringa di sostituzione contiene interruzioni di linea perché chiamano string.Replace
più 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);
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 ...
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);
abbastanza?
\r\n
hai finirai con la stringa di sostituzione due volte - non è l'ideale.
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);
}
Se si suppone che il codice venga eseguito in ambienti diversi, prenderei in considerazione l'utilizzo della Environment.NewLine
costante, poiché è specificamente newline
utilizzata 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à \n
o \r\n
.
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 );
}
}
''
in C # - non esiste un carattere vuoto. sarà '\0'
lavoro, invece?
string.Empty
sia meglio, usalo sicuramente.
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.
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
}
}
Ho dovuto sostituire il \r\n
con un ritorno a capo e un avanzamento riga \t
effettivi 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;
}
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Utilizzare il metodo .Replace ()
Line.Replace("\n", "whatever you want to replace with");
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.
Come nuova linea possono essere delimitati da \n
, \r
e \r\n
, prima ci sostituiamo \r
e \r\n
con \n
, e solo stringa di dati poi diviso.
Le seguenti righe dovrebbero andare al parseCSV
metodo:
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");
}
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.
Un'altra opzione è quella di creare un StringReader
over 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 StringBuilder
e chiamarlo .AppendLine
.
Il vantaggio è che si lascia decidere al framework cosa costituisce una "interruzione di linea".
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);