Comment remplacer des sauts de ligne dans une chaîne en C #?
Utiliser remplacer par Environment.NewLine
myString = myString.Replace(System.Environment.NewLine, "replacement text")
Comme mentionné dans d'autres publications, si la chaîne provient d'un autre environnement (OS), vous devrez remplacer cette implémentation d'environnement particulière de caractères de contrôle de nouvelle ligne .
Les solutions publiées jusqu'ici remplacent uniquement Environment.NewLine
ou échouent si la chaîne de remplacement contient des sauts de ligne car elles appellent string.Replace
plusieurs fois.
Voici une solution qui utilise une expression régulière pour effectuer les trois remplacements en un seul passage sur la chaîne. Cela signifie que la chaîne de remplacement peut contenir en toute sécurité des sauts de ligne.
string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Pour étendre la réponse de The.Anyi.9, vous devez également connaître les différents types de saut de ligne généralement utilisés . Selon l'origine de votre fichier, vous voudrez peut-être vous assurer de bien saisir toutes les alternatives ...
string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
devrait vous faire partir ...
J'utilisais Environment.Newline lorsque je voulais insérer une nouvelle ligne pour une chaîne, mais pas pour supprimer toutes les nouvelles lignes d'une chaîne.
Selon votre plate-forme, vous pouvez avoir différents types de nouvelle ligne, mais même à l'intérieur de la même plate-forme, différents types de nouvelle ligne sont souvent utilisés. En particulier lorsqu'il s'agit de formats de fichiers et de protocoles.
string ReplaceNewlines(string blockOfText, string replaceWith)
{
return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Si votre code est censé fonctionner dans des environnements différents, je considérerais d'utiliser la constante Environment.NewLine
, car il s'agit spécifiquement de la variable newline
utilisée dans l'environnement spécifique.
line = line.Replace(Environment.NewLine, "newLineReplacement");
Toutefois, si vous obtenez le texte d'un fichier provenant d'un autre système, il se peut que la réponse ne soit pas correcte et que vous deviez remplacer par toute constante de nouvelle ligne utilisée sur l'autre système. Ce sera typiquement \n
ou \r\n
.
N'oubliez pas que replace ne fait pas le remplacement dans la chaîne, mais retourne une nouvelle chaîne avec les caractères remplacés. Ce qui suit supprimera les sauts de ligne (ne les remplace pas). J'utiliserais la méthode de @Brian R. Bondy si je les remplaçais par autre chose, peut-être enveloppé comme méthode d'extension. N'oubliez pas de vérifier les valeurs NULL avant d'appeler Remplacer ou les méthodes d'extension fournies.
string line = ...
line = line.Replace( "\r", "").Replace( "\n", "" );
Comme méthodes d'extension:
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 );
}
}
Pour vous assurer que tous les moyens possibles de sauts de ligne (Windows, Mac et Unix) sont remplacés, vous devez utiliser:
string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');
et dans cet ordre, pour ne pas faire de sauts de ligne supplémentaires, lorsque vous trouvez une combinaison de caractères de fin de ligne.
Pourquoi pas les deux?
string ReplacementString = "";
Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);
Remarque: Remplacez strin
par le nom de votre chaîne d'entrée.
Je devais remplacer le \r\n
par un retour à la ligne et un saut de ligne réels, puis remplacer \t
par un onglet. Alors je suis venu avec ce qui suit:
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;
}
si vous voulez "nettoyer" les nouvelles lignes, le commentaire flamebaud utilisant regex @"[\r\n]+"
est le meilleur choix.
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
}
}
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Le meilleur moyen de remplacer les sauts de ligne en toute sécurité est
yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n") //handling mac linebreaks
cela devrait produire une chaîne avec seulement\n (par exemple, un saut de ligne) comme sauts de ligne. Ce code est également utile pour corriger les sauts de ligne mixtes.
Comme la nouvelle ligne peut être délimitée par \n
, \r
et \r\n
, nous allons d'abord remplacer \r
et \r\n
par \n
, et uniquement puis diviser la chaîne de données.
Les lignes suivantes doivent aller à la méthode parseCSV
:
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");
}
Utilisez la méthode .Replace ()
Line.Replace("\n", "whatever you want to replace with");
Une autre option consiste à créer un StringReader
sur la chaîne en question. Sur le lecteur, faites .ReadLine()
en boucle. Ensuite, vous séparez les lignes, quels que soient les séparateurs (cohérents ou incompatibles) qu’elles possédaient. Avec cela, vous pouvez procéder comme vous le souhaitez; Une possibilité consiste à utiliser un StringBuilder
et à appeler .AppendLine
dessus.
L’avantage est que vous laissez le cadre décider de ce qui constitue un "saut de ligne".
Si vous souhaitez remplacer uniquement les nouvelles lignes:
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);
Si vous souhaitez remplacer les nouvelles lignes, les onglets et les espaces:
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);
string s = Regex.Replace(source_string, "\n", "\r\n");
ou
string s = Regex.Replace(source_string, "\r\n", "\n");
en fonction de quel chemin vous voulez aller.
J'espère que ça aide.