web-dev-qa-db-fra.com

Remplacer les sauts de ligne dans une chaîne C #

Comment remplacer des sauts de ligne dans une chaîne en C #?

472
YonahW

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 .

676
Corin Blaikie

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);
404
Mark Byers

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

170
ZombieSheep

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);
}
35
Brian R. Bondy

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.

18
driis

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

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.

9
Dominik Szymański

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.

6
RAY

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

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
  }
}
4
ewwink
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
4
Matt Hinze

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.

2
data

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

Utilisez la méthode .Replace ()

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

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".

0
Jeppe Stig Nielsen

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

0
user181261