Comment supprimer les nouvelles lignes du début et de la fin d'une chaîne?

129

J'ai une chaîne qui contient du texte suivi d'une ligne vide. Quelle est la meilleure façon de conserver la partie avec du texte, mais de supprimer le retour à la ligne d'espacement à la fin?

Confiqure
la source
1
Non ce n'est pas. La question dans le lien concerne plutôt «remplacer».
Faiz

Réponses:

278

Utilisez la String.trim()méthode pour éliminer les espaces (espaces, nouvelles lignes, etc.) du début et de la fin de la chaîne.

String trimmedString = myString.trim();
Crozin
la source
18
La question concerne les nouvelles lignes. Cela supprime plus que de simples nouvelles lignes
mmm
21
String.replaceAll("[\n\r]", "");
Jean B
la source
14
Bro, @JohnB Cela supprimera également tous les caractères de nouvelle ligne entre la chaîne. la demande est de supprimer uniquement le caractère de nouvelle ligne de début et de fin.
siddhartha
5

tl; dr

String cleanString = dirtyString.strip() ; // Call new `String::string` method.

String::strip…

L'ancienne String::trimméthode a une étrange définition de l' espace blanc .

Comme discuté ici , Java 11 ajoute de nouvelles strip…méthodes à la Stringclasse. Celles-ci utilisent une définition d'espaces plus basée sur Unicode. Voir les règles de cette définition dans la classe JavaDoc pour Character::isWhitespace.

Exemple de code.

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

Ou vous pouvez supprimer uniquement l' espace blanc de début ou de fin .

Vous ne mentionnez pas exactement quel (s) point (s) de code composent vos nouvelles lignes. J'imagine que votre nouvelle ligne est probablement incluse dans cette liste de points de code ciblés par strip:

  • Il s'agit d'un caractère d'espace Unicode (SPACE_SEPARATOR, LINE_SEPARATOR ou PARAGRAPH_SEPARATOR) mais ce n'est pas aussi un espace insécable ('\ u00A0', '\ u2007', '\ u202F').
  • C'est '\ t', U + 0009 TABULATION HORIZONTALE.
  • C'est '\ n', U + 000A LINE FEED.
  • Il s'agit de '\ u000B', U + 000B TABULATION VERTICALE.
  • C'est '\ f', U + 000C FORM FEED.
  • C'est '\ r', U + 000D RETOUR CHARIOT.
  • Il s'agit de '\ u001C', SÉPARATEUR DE FICHIERS U + 001C.
  • Il s'agit de '\ u001D', U + 001D GROUP SEPARATOR.
  • C'est '\ u001E', SÉPARATEUR D'ENREGISTREMENTS U + 001E.
  • C'est '\ u001F', U + 0
Basil Bourque
la source
4

Ce code Java fait exactement ce qui est demandé dans le titre de la question, à savoir "supprimer les nouvelles lignes du début et de la fin d'une chaîne-java":

String.replaceAll("^[\n\r]", "").replaceAll("[\n\r]$", "")

Supprimez les nouvelles lignes uniquement à partir de la fin de la ligne:

String.replaceAll("[\n\r]$", "")

Supprimez les nouvelles lignes uniquement depuis le début de la ligne:

String.replaceAll("^[\n\r]", "")
Alexandre Samoylov
la source
Pourriez-vous fournir un contexte supplémentaire à votre réponse? De cette façon, tout le monde peut comprendre ce que fait votre code et pourquoi.
Mariano Zorrilla le
J'ai ajouté des explications à ma réponse. J'espère que maintenant c'est clair.
Alexander Samoylov le
1
String trimStartEnd = "\n TestString1 linebreak1\nlinebreak2\nlinebreak3\n TestString2 \n";
System.out.println("Original String : [" + trimStartEnd + "]");
System.out.println("-----------------------------");
System.out.println("Result String : [" + trimStartEnd.replaceAll("^(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])|(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])$", "") + "]");
  1. Début d'une chaîne = ^,
  2. Fin d'une chaîne = $,
  3. combinaison regex = | ,
  4. Saut de ligne = \ r \ n | [\ n \ x0B \ x0C \ r \ u0085 \ u2028 \ u2029]
hmmh
la source
1

Si vous souhaitez uniquement supprimer les sauts de ligne (pas les espaces, les tabulations) au début et à la fin d'une chaîne (pas entre les deux), vous pouvez utiliser cette approche:

Utilisez une expression régulière pour supprimer les retours chariot ( \\r) et les sauts de ligne ( \\n) du début ( ^) et de la fin ( $) d'une chaîne:

 s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "")

Exemple complet:

public class RemoveLineBreaks {
    public static void main(String[] args) {
        var s = "\nHello\nWorld\n";
        System.out.println("before: >"+s+"<");
        s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "");
        System.out.println("after: >"+s+"<");
    }
}

Il sort:

before: >
Hello
World
<
after: >Hello
World<
slartidan
la source
0

Je vais également ajouter une réponse à cela car, même si j'avais la même question, la réponse fournie ne suffisait pas. Après avoir réfléchi, j'ai réalisé que cela pouvait être fait très facilement avec une expression régulière.

Pour supprimer les nouvelles lignes depuis le début:

// Trim left
String[] a = "\n\nfrom the beginning\n\n".split("^\\n+", 2);

System.out.println("-" + (a.length > 1 ? a[1] : a[0]) + "-");

et fin d'une chaîne:

// Trim right
String z = "\n\nfrom the end\n\n";

System.out.println("-" + z.split("\\n+$", 2)[0] + "-");

Je suis certain que ce n'est pas la manière la plus efficace de couper une corde. Mais cela semble être le moyen le plus propre et le plus simple d'intégrer une telle opération.

Notez que la même méthode peut être utilisée pour couper toute variation et combinaison de caractères de chaque extrémité car il s'agit d'une simple expression régulière.

Zhro
la source
Ouais mais que faire si vous ne savez pas combien de lignes il y a au début / à la fin? Votre solution suppose qu'il y a exactement 2 nouvelles lignes dans les deux cas
Luka Govedič
Le deuxième paramètre de split()est juste la limite. Laissez-le désactivé si vous souhaitez faire correspondre un nombre illimité de fois.
Zhro
0

Essaye ça

function replaceNewLine(str) { 
  return str.replace(/[\n\r]/g, "");
}
Jobelle
la source
-3
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Khan
la source
2
Cela ne répond pas correctement à la question. Il supprime tous les CR et LF, pas seulement ceux du début et de la fin.
james.garriss
Cela remplacera tout, pas seulement du début et de la fin.
Hamzeh Soboh