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

512

Comment puis-je remplacer les sauts de ligne dans une chaîne en C #?

YonahW
la source
2
Veuillez nous en dire plus: qu'est-ce qu'un "saut de ligne" pour vous? Avec quoi voulez-vous les remplacer?
Jay Bazuzi
ha ha. Je vérifiais la même chose en java quand j'ai découvert que System.getProperty ("line.separator") était curieux de connaître l'homologue en C #. votre message m'a aidé.
Ravisha

Réponses:

715

Utilisez remplacer par Environment.NewLine

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

Comme mentionné dans d'autres articles, si la chaîne provient d'un autre environnement (OS), vous devrez remplacer cette implémentation d'environnements particuliers de nouveaux caractères de contrôle de ligne .

Corin Blaikie
la source
8
Tout d'abord, cela n'a pas fonctionné pour moi. Après quelques recherches, j'ai trouvé la solution: j'ai dû utiliser 'using System;' ou 'System.Environment.NewLine'
Smolla
12
N'a pas supprimé tous les caractères de nouvelle ligne. Essayez cette chaîne "\ n \ r \ nMon message \ r \ n \ n \ r \ n est le suivant. \ N \ n \ r \ n"
Shakti Prakash Singh
13
En général, j'aime cette solution. Cependant, notez que même sur le même système d'exploitation, les nouvelles lignes réelles peuvent ne pas correspondre. Cela m'est arrivé pourquoi le traitement a renvoyé SQL. Les nouvelles lignes étaient \ n, tandis que Environment.NewLine était \ r \ n. Le résultat était que rien ne correspondait donc les nouvelles lignes sont restées.
Dono
@Dono> d'où viennent les données SQL? Probablement d'une source externe traitant de nouvelles lignes à la manière UNIX. C'est un problème avec le format des données, pas avec le système d'exploitation ou cette méthode ...
Laurent S.
Cela devrait être l'une des méthodes statiques de la classe String. .NET lui-même devrait pouvoir détecter le format des sauts de ligne source dans une chaîne et le convertir au format Environment.NewLine \ r \ n ...
Dean Kuga
442

Les solutions publiées jusqu'à présent ne remplacent Environment.NewLineou échouent que si la chaîne de remplacement contient des sauts de ligne car elles appellent string.Replaceplusieurs 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);
Mark Byers
la source
3
donc votre dicton faisant Regex.Replace (entrée, @ "[\ r \ n] +", replacementString) n'accomplirait pas la même tâche?
flamebaud
7
@flamebaud Non, cela produirait un résultat différent s'il y a plusieurs sauts de ligne dans une rangée. "\ r \ n? | \ n" remplacerait chaque saut de ligne tandis que "[\ r \ n] +" ferait un seul remplacement pour n'importe quel nombre de sauts de ligne.
David Hammond
Pour ceux qui s'inquiètent de plusieurs sauts de ligne: / (\ r \ n? | \ N) / gm
BobbyA
4
C'est en fait la bonne solution si vous souhaitez supprimer le saut de ligne dans une chaîne qui peut provenir de différents systèmes d'exploitation. Un bon exemple est le formatage JSON. +1
Bastien Vandamme
1
Si la chaîne verbatim (@ prefix) n'est pas utilisée, vous devrez avoir deux barres obliques inverses partout où elle est utilisée, donc la réponse de @mark_byers ci-dessus est toujours correcte. Le préfixe @ fait en sorte que la barre oblique inverse fasse partie de la chaîne qu'il doit être pour que Regex l'utilise comme caractère d'échappement.
Kirk Liemohn
173

Pour étendre la réponse de The.Anyi.9, vous devez également être conscient des différents types de saut de ligne généralement utilisés . En fonction de l'origine de votre fichier, vous voudrez peut-être vous assurer de saisir toutes les alternatives ...

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

devrait vous permettre de continuer ...

ZombieSheep
la source
6
Tout d'abord, j'ai mieux aimé l'environnement, mais si la chaîne ne vient pas du système, elle ne fonctionnera pas. +1
Flo
1
ne Line.Replace("\n", replaceWith).Replace("\r", replaceWith);suffit pas ?
Thomas Ayoub
5
Non, car si vous en avez, \r\nvous vous retrouverez avec la chaîne de remplacement deux fois - pas idéal.
ZombieSheep
1
Vous n'avez pas besoin de littéraux de chaîne? chaîne suppriméeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey
2
@ShawnDotey pas besoin, nous voulons remplacer les caractères de contrôle, pas les séquences de barre oblique inverse et de lettre.
N.Kudryavtsev
38

J'utiliserais 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 sauts de ligne, mais même au sein de la même plate-forme, souvent différents types de sauts de ligne sont 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);
}
Brian R. Bondy
la source
C'est la seule chose qui a fonctionné pour moi lorsque j'ai voulu réduire un code de page Web récupéré sur une seule ligne (pour faciliter les modèles d'expression régulière).
Paw Baltzersen
Tout à fait d'accord avec Brian R. Bondy. La solution proposée par Corin et tant votée est au moins très naïve.
Tarif
18

Si votre code est censé s'exécuter dans différents environnements, j'envisagerais d'utiliser la Environment.NewLineconstante, car elle est spécifiquement newlineutilisée dans l'environnement spécifique.

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

Cependant, si vous obtenez le texte d'un fichier provenant d'un autre système, ce n'est peut-être pas la bonne réponse, et vous devez remplacer par la constante de nouvelle ligne utilisée sur l'autre système. Ce sera généralement \nou \r\n.

driis
la source
Vous devez le réaffecter à la variable d'origine car le remplacement ne se produit pas sur place.
tvanfosson
@driss Je voudrais savoir comment choisir une bonne constante de ligne lorsque vous ne savez pas de quel système provient un fichier ... cette solution semble vraiment UNIVERSELLE.
Tarif
14

N'oubliez pas que replace ne fait pas le remplacement dans la chaîne, mais renvoie une nouvelle chaîne avec les caractères remplacés. Ce qui suit supprimera les sauts de ligne (ne les remplacera pas). J'utiliserais la méthode @Brian R. Bondy si vous les remplaçiez par quelque chose d'autre, peut-être encapsulé comme une méthode d'extension. N'oubliez pas de vérifier les valeurs nulles avant d'appeler Replace 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 );
   }
}
tvanfosson
la source
ne peut pas avoir ''en C # - il n'y a pas de caractère vide. va '\0'travailler à la place?
Shevek
1
@Shevek - vient d'utiliser les mauvaises citations. Doit avoir fait une bonne quantité de javascript le jour où j'ai répondu à cette question.
tvanfosson
@Califf - c'est équivalent, pas mieux.
tvanfosson
2
l'erreur que vous avez faite ici prouve simplement qu'elle est meilleure. La plupart des entreprises pour lesquelles j'ai travaillé ont leur norme de codage - N'UTILISEZ PAS DE LITÉRAUX HARDCODÉS.
Tarif
2
@Califf "l'erreur" que j'ai commise n'aurait pas été commise dans un IDE avec Intellisense ni compilée. Si vous pensez que string.Emptyc'est mieux, utilisez-le par tous les moyens.
tvanfosson
10

Pour vous assurer que toutes les possibilités de sauts de ligne (Windows, Mac et Unix) sont remplacées, 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.

Dominik Szymański
la source
8

si vous voulez "nettoyer" les nouvelles lignes, le commentaire de flamebaud en 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
  }
}
ewwink
la source
La meilleure réponse pour remplacer de nouvelles lignes, dans la plupart des cas.
Shahbaz Ahmad
Merci pour cet exemple de code utile. J'ai été corrigé via ce sytnax: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu
6

Je devais remplacer le \r\npar un retour chariot et un saut de ligne \tréels et le remplacer par un onglet réel. J'ai donc trouvé 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;
}
Zamir
la source
6

Pourquoi pas les deux?

string ReplacementString = "";

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

Remarque: remplacez strinpar le nom de votre chaîne d'entrée.

RAYON
la source
4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Matt Hinze
la source
2

Utilisez la méthode .Replace ()

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

La meilleure façon 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, saut de ligne) comme sauts de ligne. ce code est également utile pour corriger les sauts de ligne mixtes.

Les données
la source
2

Comme la nouvelle ligne peut être délimitée par \n, \ret \r\n, d'abord, nous remplacerons \ret \r\npar \n, et ensuite seulement diviserons la chaîne de données.

Les lignes suivantes doivent aller à la parseCSVméthode:

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");
}
Amrik
la source
0
string s = Regex.Replace(source_string, "\n", "\r\n");

ou

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

en fonction de la direction que vous souhaitez prendre.

J'espère que ça aide.


la source
0

Une autre option consiste à créer un StringReadersur la chaîne en question. Sur le lecteur, faites .ReadLine()en boucle. Ensuite, vous avez les lignes séparées, peu importe les séparateurs (cohérents ou incohérents) qu'ils avaient. Avec cela, vous pouvez procéder comme vous le souhaitez; une possibilité est d'utiliser un StringBuilderet de l'appeler .AppendLine.

L'avantage est que vous laissez le cadre décider de ce qui constitue un «saut de ligne».

Jeppe Stig Nielsen
la source
0

Si vous souhaitez remplacer uniquement les retours à la ligne:

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 retours à la ligne, les tabulations et les espaces blancs:

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);
Tadej
la source