Comment puis-je remplacer tous les sauts de ligne d'une chaîne dans Java de manière à fonctionner sous Windows et Linux (c'est-à-dire sans problèmes de système de retour chariot/saut de ligne/nouvelle ligne, etc.)?
J'ai essayé (note 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?
Vous devez définir text
sur les résultats de text.replace()
:
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Cela est nécessaire car les chaînes sont immuables - appeler replace
ne modifie pas la chaîne d'origine, elle en renvoie une nouvelle qui a été modifiée. Si vous n'attribuez pas le résultat à text
, cette nouvelle chaîne est perdue et récupérée.
Pour obtenir la chaîne newline pour n’importe quel environnement, elle est disponible en appelant System.getProperty("line.separator")
.
Comme indiqué dans d'autres réponses, votre code ne fonctionne pas principalement parce que String.replace(...)
ne modifie pas la cible String
. (Cela ne peut pas - Java les chaînes sont immuables!) En réalité, replace
crée et renvoie un nouvel objet String
avec les caractères modifiés en fonction des besoins. Mais votre code jette alors cette String
...
Voici quelques solutions possibles. Lequel est le plus correct dépend de ce que vous essayez exactement de faire.
// #1
text = text.replace("\n", "");
Supprime simplement tous les caractères de nouvelle ligne. Cela ne convient pas aux fins de ligne Windows ou Mac.
// #2
text = text.replace(System.getProperty("line.separator"), "");
Supprime toutes les terminaisons de ligne pour la plate-forme actuelle. Cela ne convient pas au cas où vous essayez de traiter (par exemple) un fichier UNIX sous Windows ou inversement.
// #3
text = text.replaceAll("\\r|\\n", "");
Supprime tous les terminateurs de ligne Windows, UNIX ou Mac. Cependant, si le fichier d'entrée est du texte, cela concaténera des mots; par exemple.
Goodbye cruel
world.
devient
Goodbye cruelworld.
Donc, vous voudrez peut-être faire ceci:
// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");
qui remplace chaque terminateur de ligne par un espace. Depuis Java 8, vous pouvez également le faire:
// #5
text = text.replaceAll("\\R", " ");
Et si vous souhaitez remplacer plusieurs séparateurs de lignes par un seul espace:
// #6
text = text.replaceAll("\\R+", " ");
Si vous souhaitez supprimer uniquement les terminaisons de ligne valides sur le système d'exploitation actuel, procédez comme suit:
text = text.replaceAll(System.getProperty("line.separator"), "");
Si vous voulez vous assurer que vous supprimez les séparateurs de lignes, vous pouvez le faire comme ceci:
text = text.replaceAll("\\r|\\n", "");
Ou un peu plus verbeux, mais moins regexy:
text = text.replaceAll("\\r", "").replaceAll("\\n", "");
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:
import org.Apache.commons.lang3.StringUtils;
final String cleansedString = StringUtils.normalizeSpace(rawString);
str = str.replaceAll("\\r\\n|\\r|\\n", " ");
A fonctionné parfaitement pour moi après avoir recherché beaucoup, après avoir échoué avec toutes les autres lignes.
Ce serait efficace je suppose
String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
édité pour mettre en évidence la syntaxe
Les sauts de ligne ne sont pas les mêmes sous windows/linux/mac. Vous devez utiliser System.getProperties avec l'attribut line.separator.
String text = readFileAsString("textfile.txt").replaceAll("\n", "");
Même si la définition de trim () sur le site Web Oracle est "Renvoie une copie de la chaîne, les espaces de début et de fin étant omis".
la documentation omet d'indiquer que les caractères de nouvelle ligne (début et fin) seront également supprimés.
En bref, String text = readFileAsString("textfile.txt").trim();
fonctionnera également pour vous. (Vérifié avec Java 6)
Vous voudrez peut-être lire votre fichier avec un BufferedReader
. Cette classe peut diviser les entrées en lignes individuelles que vous pouvez assembler à votre guise. La façon dont fonctionne BufferedReader
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:
BufferedReader br = new BufferedReader(
new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
String line = br.readLine();
if (line == null)
break;
sb.append(line);
sb.append(' '); // SEE BELOW
}
String text = sb.toString();
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 le dernier mot d'une ligne et le premier mot de la ligne suivante.
String text = readFileAsString("textfile.txt").replace("\n","");
.replace renvoie une nouvelle chaîne, les chaînes dans Java sont immuables.
Je trouve cela étrange que (Apache) StringUtils n'ait pas encore été traité ici.
vous pouvez supprimer toutes les nouvelles lignes (ou toute autre occurrence d'une sous-chaîne) d'une chaîne à l'aide de la méthode .replace
StringUtils.replace(myString, "\n", "");
Cette ligne remplacera toutes les nouvelles lignes par la chaîne vide.
parce que newline est techniquement un caractère, vous pouvez éventuellement utiliser la méthode .replaceChars
qui remplacera les caractères
StringUtils.replaceChars(myString, '\n', '');
Vous pouvez utiliser Apache Ions utilitaire pour parcourir la ligne et ajouter chaque ligne à StringBuilder. Et n'oubliez pas de fermer le InputStream
StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);
Vous pouvez utiliser des méthodes génériques pour remplacer un caractère par un autre.
public static void removeWithAnyChar(String str, char replceChar,
char replaceWith) {
char chrs[] = str.toCharArray();
int i = 0;
while (i < chrs.length) {
if (chrs[i] == replceChar) {
chrs[i] = replaceWith;
}
i++;
}
}
FYI si vous pouvez vouloir remplacer les sauts de ligne multiples simultanés par un saut de ligne unique, vous pouvez utiliser
myString.trim().replaceAll("[\n]{2,}", "\n")
Ou remplacer par un seul espace
myString.trim().replaceAll("[\n]{2,}", " ")