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é.
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 .
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);
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 ...
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.
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.
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","");
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:
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.
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 rowsvar rows = data.split("\n");}
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».
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);
Réponses:
Utilisez remplacer par
Environment.NewLine
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 .
la source
Les solutions publiées jusqu'à présent ne remplacent
Environment.NewLine
ou échouent que si la chaîne de remplacement contient des sauts de ligne car elles appellentstring.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.
la source
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 ...
devrait vous permettre de continuer ...
la source
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);
suffit pas ?\r\n
vous vous retrouverez avec la chaîne de remplacement deux fois - pas idéal.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.
la source
Si votre code est censé s'exécuter dans différents environnements, j'envisagerais d'utiliser la
Environment.NewLine
constante, car elle est spécifiquementnewline
utilisée dans l'environnement spécifique.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
\n
ou\r\n
.la source
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.
Comme méthodes d'extension:
la source
''
en C # - il n'y a pas de caractère vide. va'\0'
travailler à la place?string.Empty
c'est mieux, utilisez-le par tous les moyens.Pour vous assurer que toutes les possibilités de sauts de ligne (Windows, Mac et Unix) sont remplacées, vous devez utiliser:
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.
la source
si vous voulez "nettoyer" les nouvelles lignes, le commentaire de flamebaud en utilisant regex
@"[\r\n]+"
est le meilleur choix.la source
Je devais remplacer le
\r\n
par un retour chariot et un saut de ligne\t
réels et le remplacer par un onglet réel. J'ai donc trouvé ce qui suit:la source
Pourquoi pas les deux?
Remarque: remplacez
strin
par le nom de votre chaîne d'entrée.la source
la source
Utilisez la méthode .Replace ()
la source
La meilleure façon de remplacer les sauts de ligne en toute sécurité est
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.
la source
Comme la nouvelle ligne peut être délimitée par
\n
,\r
et\r\n
, d'abord, nous remplacerons\r
et\r\n
par\n
, et ensuite seulement diviserons la chaîne de données.Les lignes suivantes doivent aller à la
parseCSV
méthode:la source
ou
en fonction de la direction que vous souhaitez prendre.
J'espère que ça aide.
la source
Une autre option consiste à créer un
StringReader
sur 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 unStringBuilder
et de l'appeler.AppendLine
.L'avantage est que vous laissez le cadre décider de ce qui constitue un «saut de ligne».
la source
Si vous souhaitez remplacer uniquement les retours à la ligne:
Si vous souhaitez remplacer les retours à la ligne, les tabulations et les espaces blancs:
la source