Comment puis-je remplacer tous les sauts de ligne d'une chaîne en Java d'une manière qui fonctionnera sur Windows et Linux (c'est-à-dire pas de problèmes spécifiques au système d'exploitation de retour chariot / saut de ligne / nouvelle ligne, etc.)?
J'ai essayé (notez que readFileAsString est une fonction qui lit un fichier texte dans une chaîne):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
mais cela ne semble pas fonctionner.
Comment cela peut-il être fait?
java
string
newline
line-breaks
pirate
la source
la source
myString.trim().replaceAll("[\n]{2,}", "\n")
Ou remplacer par un seul espacemyString.trim().replaceAll("[\n]{2,}", " ")
Réponses:
Vous devez définir
text
les résultats detext.replace()
:Cela est nécessaire car les chaînes sont immuables - l'appel
replace
ne change pas la chaîne d'origine, il renvoie une nouvelle qui a été modifiée. Si vous n'affectez pas le résultat àtext
, cette nouvelle chaîne est perdue et récupérée.Quant à obtenir la chaîne de nouvelle ligne pour n'importe quel environnement - qui est disponible en appelant
System.getProperty("line.separator")
.la source
replace()
méthode renvoie le résultat souhaité. Voir également la documentation de l'API: java.sun.com/javase/6/docs/api/java/lang/… Edit: ah vous avez déjà édité cela vous-même par la suite :)text = text.replace("\r\n", " ").replace("\n", " ");
- être une meilleure solution: sinon les mots seront «collés» les uns aux autres (sans le remplacement à un seul espace)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
prend en regex,replace
prend en chaînes littérales, les deux remplacent toutes les occurrences.Comme indiqué dans d'autres réponses, votre code ne fonctionne pas principalement parce
String.replace(...)
qu'il ne modifie pas la cibleString
. (Il ne peut pas - les chaînes Java sont immuables!) Cereplace
qui fait réellement est de créer et de renvoyer un nouvelString
objet avec les caractères modifiés selon les besoins. Mais votre code jette alorsString
...Voici quelques solutions possibles. Laquelle est la plus correcte dépend de ce que vous essayez de faire exactement.
Supprime simplement tous les caractères de nouvelle ligne. Cela ne résiste pas aux terminaisons de ligne Windows ou Mac.
Supprime tous les terminateurs de ligne pour la plate-forme actuelle. Cela ne résout pas le cas où vous essayez de traiter (par exemple) un fichier UNIX sous Windows, ou vice versa.
Supprime tous les terminateurs de ligne Windows, UNIX ou Mac. Cependant, si le fichier d'entrée est du texte, cela concaténera les mots; par exemple
devient
Donc, vous voudrez peut-être faire ceci:
qui remplace chaque terminaison de ligne par un espace. Depuis Java 8, vous pouvez également faire ceci:
Et si vous souhaitez remplacer plusieurs séparateurs de lignes par un espace:
la source
Si vous souhaitez supprimer uniquement les terminateurs de ligne valides sur le système d'exploitation actuel, vous pouvez procéder comme suit:
Si vous voulez vous assurer de supprimer tous les séparateurs de ligne, vous pouvez le faire comme ceci:
Ou, un peu plus verbeux, mais moins regexy:
la source
text.replaceAll("(\\r|\\n)+", " ")
et (en supposant que gourmand est par défaut en Java?), Vous aurez une solution avec un seul espace pour chaque séquence de nouveaux caractères de ligne.Cette fonction normalise tous les espaces, y compris les sauts de ligne, en espaces simples. Pas exactement ce que la question initiale demandait, mais susceptible de faire exactement ce qui est nécessaire dans de nombreux cas:
la source
Ce serait efficace je suppose
la source
A parfaitement fonctionné pour moi après avoir beaucoup cherché, ayant échoué avec toutes les autres lignes.
la source
Les sauts de ligne ne sont pas les mêmes sous windows / linux / mac. Vous devez utiliser System.getProperties avec l'attribut line.separator.
la source
.replace renvoie une nouvelle chaîne, les chaînes en Java sont immuables.
la source
Vous voudrez peut-être lire votre fichier avec un
BufferedReader
. Cette classe peut diviser l'entrée en lignes individuelles, que vous pouvez assembler à volonté. Le cheminBufferedReader
fonctionnement reconnaît automatiquement les conventions de fin de ligne des mondes Linux, Windows et MacOS, quelle que soit la plate-forme actuelle.Par conséquent:
Notez que
readLine()
n'inclut pas le terminateur de ligne dans la chaîne renvoyée. Le code ci-dessus ajoute un espace pour éviter de coller ensemble le dernier mot d'une ligne et le premier mot de la ligne suivante.la source
Même si la définition de trim () dans le site Web Oracle est "Renvoie une copie de la chaîne, avec les espaces de début et de fin omis".
la documentation omet de dire que les nouveaux caractères de ligne (début et fin) seront également supprimés.
En bref,
String text = readFileAsString("textfile.txt").trim();
cela fonctionnera également pour vous. (Vérifié avec Java 6)la source
Je trouve étrange que (Apache) StringUtils ne soit pas encore couvert ici.
vous pouvez supprimer tous les sauts de ligne (ou toute autre occurrence d'une sous-chaîne d'ailleurs) d'une chaîne en utilisant la
.replace
méthodeCette ligne remplacera toutes les nouvelles lignes par la chaîne vide.
parce que la nouvelle ligne est techniquement un caractère, vous pouvez éventuellement utiliser la
.replaceChars
méthode qui remplacera les caractèresla source
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Pour info si vous pouvez remplacer les sauts de ligne simultanés par des sauts de ligne simples, vous pouvez utiliser
Ou remplacez par un seul espace
la source
Vous pouvez utiliser des IOUtils apache commons pour parcourir la ligne et ajouter chaque ligne à StringBuilder. Et n'oubliez pas de fermer InputStream
la source
Vous pouvez utiliser des méthodes génériques pour remplacer n'importe quel caractère par n'importe quel caractère.
la source
org.apache.commons.lang.StringUtils # chopNewline
la source
Essayez de faire ceci:
la source
\n
il n'y a\r\n
plus si vous remplacez \ n et il y a un \\ n il sera remplacé donc seul le \ restera.