web-dev-qa-db-fra.com

Split Java String par New Line

J'essaie de scinder le texte dans une variable JTextArea en utilisant une expression rationnelle pour scinder la chaîne par \n. Toutefois, cela ne fonctionne pas et j'ai également essayé avec \r\n|\r|n et de nombreuses autres combinaisons d'expressions rationnelles . Code:

public void insertUpdate(DocumentEvent e) {
    String split[], docStr = null;
    Document textAreaDoc = (Document)e.getDocument();

    try {
        docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
    } catch (BadLocationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    split = docStr.split("\\n");
}
347
dr.manhattan

Cela devrait vous couvrir:

String lines[] = string.split("\\r?\\n");

Il ne faut vraiment se préoccuper que de deux nouvelles lignes (UNIX et Windows).

650
cletus

Si vous ne voulez pas de lignes vides:

String.split("[\\r\\n]+")
119
Gumbo

La méthode split utilise regex (expressions régulières). Comme Java 8 regex prend en charge \R, ce qui représente (à partir de documentation de la classe Pattern ):

Linebreak Matcher
\R Toute séquence de saut de ligne Unicode est équivalente à \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Nous pouvons donc l'utiliser pour correspondre à:

Comme vous le voyez, \r\n est placé au début de regex, ce qui garantit que regex essaiera de faire correspondre ce pair en premier, et que si cette correspondance échoue, il tentera de faire correspondre les séparateurs de ligne à caractère unique.


Donc, si vous voulez diviser le séparateur de lignes, utilisez split("\\R")

Si vous ne voulez pas supprimer du tableau résultant les chaînes vides en fin de chaîne "" , utilisez split(regex, limit) avec un paramètre limit négatif comme split("\\R", -1).

Si vous souhaitez traiter une ou plusieurs lignes vides continues comme un seul délimiteur, utilisez split("\\R+").

89
Pshemo
String.split(System.getProperty("line.separator"));

Cela devrait être indépendant du système

41
Shervin Asgari

Vous n'avez pas à doubler les caractères d'échappement dans les groupes de caractères.

Pour toutes les lignes non vides, utilisez:

String.split("[\r\n]+")
11
Martin

Peut-être que cela fonctionnerait:

Supprimez les doubles barres obliques inverses du paramètre de la méthode split:

split = docStr.split("\n");
7
Michael

Une nouvelle méthode lines a été introduite dans la classe String dans Java-11 , qui renvoie Stream<String>

Retourne un flux de sous-chaînes extraites de cette chaîne partitionnée par les terminateurs de ligne.

Les fins de ligne reconnues sont le saut de ligne "\ n" (U + 000A), chariot return "\ r" (U + 000D) et un retour à la ligne suivi immédiatement d'un saut de ligne "\ r\n" (U + 000D U + 000A).

Voici quelques exemples: 

jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
 ipusm
 sit

jshell> "lorem \n ipusm \r  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

jshell> "lorem \n ipusm \r\n  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

String # lines ()

5
Anton Balaniuc

Pour éviter que des lignes vides ne soient écrasées, utilisez:

String lines[] = String.split("\\r?\\n", -1);
4
sevenforce

En fait, toutes les réponses données ici ne respectent pas la définition des nouvelles lignes donnée par Javas, comme indiqué dans la figure par exemple BufferedReader # readline. Java accepte \n, \r et \r\n en tant que nouvelle ligne. Certaines réponses correspondent à plusieurs lignes vides ou fichiers mal formés. Par exemple. <sometext>\n\r\n<someothertext> lorsqu’on utilise [\r\n]+ donnerait deux lignes. 

String lines[] = string.split("(\r\n|\r|\n)", -1);

En revanche, la réponse ci-dessus a les propriétés suivantes:

  • il est conforme à la définition de Javas d’une nouvelle ligne telle que p. ex. le BufferedReader l'utilise
  • il ne correspond pas à plusieurs nouvelles lignes 
  • il ne supprime pas les lignes vides de fin
4
Till Schäfer

Le code ci-dessus ne fait rien de visible, il calcule ensuite le calcul. Est-ce le code que vous avez utilisé, ou juste un exemple pour cette question? 

essayez de faire textAreaDoc.insertString (int, String, AttributeSet) à la fin?

3
Chii

Si, pour une raison quelconque, vous ne souhaitez pas utiliser String.split (par exemple, à cause de expressions régulières ) et que vous souhaitez utiliser la programmation fonctionnelle sur Java 8 ou une version plus récente:

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());
2

Dans JDK11, la classe String a une méthode lines():

Renvoyer un flux de lignes extraites de cette chaîne, séparées par terminateurs de ligne. 

En outre, la documentation poursuit:

Un terminateur de ligne est l’un des éléments suivants: un caractère d’alimentation de ligne "\ n" (U + 000A), un caractère de retour de chariot "\ r" (U + 000D) ou un chariot return suivi immédiatement par un saut de ligne "\ r\n" (U + 000D U + 000A). UNE line est soit une séquence de zéro ou plusieurs caractères suivis d'un ligne de terminaison, ou il s’agit d’une séquence d’un ou plusieurs caractères suivi de la fin de la chaîne. Une ligne n'inclut pas la ligne terminateur.

Avec cela on peut simplement faire:

Stream<String> stream = str.lines();

alors si vous voulez un tableau:

String[] array = str.lines().toArray(String[]::new);

Etant donné que cette méthode retourne un Stream, elle contient beaucoup d'options car elle permet d'écrire concise et une expression déclarative d'opérations éventuellement parallèles.

1
Aomine

Après des tentatives infructueuses sur la base de toutes les solutions données. Je remplace \n par un mot spécial, puis je me sépare. Pour moi, le tour suivant:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

Je ne pouvais pas reproduire l'exemple donné dans la question. Mais je suppose que cette logique peut être appliquée.

1
kravi

En guise d'alternative aux réponses précédentes, l'API Splitter de goyave peut être utilisée si d'autres opérations doivent être appliquées aux lignes résultantes, telles que le rognage ou le filtrage des lignes vides:

import com.google.common.base.Splitter;

Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

Notez que le résultat est une Iterable et non un tableau.

1
Thomas Naskali
  • essayez cet espoir que cela vous a aidé 

 String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();

try {
    docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

split = docStr.split("\n");
0
Vishal Yadav

Il existe trois conventions différentes (on peut dire que ce sont des normes de facto) pour définir et afficher un saut de ligne:

  • carriage return + line feed
  • line feed
  • carriage return

Dans certains éditeurs de texte, il est possible d’échanger l’un contre l’autre:

Notepad++

La chose la plus simple est de normaliser à line feed et ensuite de diviser.

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);
0
Paul Vargas

Les réponses ci-dessus ne m'ont pas aidé sur Android, grâce à la réponse Pshemo qui a fonctionné pour moi sur Android. Je vais laisser un peu de réponse de Pshemo ici:

split("\\\\n")
0
clasher

Il y a un nouveau garçon dans la ville, vous n'avez donc pas besoin de gérer toutes les complexités ci-dessus .À partir de la 11e JDK, il vous suffit d'écrire comme une seule ligne de code, elle divisera les lignes et vous retournera. Chaîne.

public class MyClass {
public static void main(String args[]) {
   Stream<String> lines="foo \n bar \n baz".lines();
   //Do whatever you want to do with lines
}}

Quelques références . https://docs.Oracle.com/fr/Java/javase/11/docs/api/Java.base/Java/lang/String.html#lines ()https://www.azul.com/90-new-features-and-apis-in-jdk-11/

J'espère que cela sera utile à quelqu'un. Bonne codage.

0
Red Boy