Split Java Ssortingng par New Line

J’essaie de diviser le texte dans un JTextArea utilisant une regex pour diviser la chaîne par \n Cependant, cela ne fonctionne pas et j’ai aussi essayé par \r\n|\r|n et beaucoup d’autres combinaisons de regex. Code:

 public void insertUpdate(DocumentEvent e) { Ssortingng 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"); } 

Cela devrait vous couvrir:

 Ssortingng lines[] = ssortingng.split("\\r?\\n"); 

Il n’y a vraiment que deux nouvelles lignes (UNIX et Windows) dont vous devez vous préoccuper.

Si vous ne voulez pas de lignes vides:

 Ssortingng.split("[\\r\\n]+") 

split méthode split utilise regex (expressions régulières). Depuis que Java 8 regex supporte \R qui représente (à partir de la documentation de la classe Pattern ):

Matcher le bris de ligne
\ 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 faire correspondre:

  • \u000D\000A -> \r\n pair
  • \ u000A -> saut de ligne ( \n )
  • \ u000B -> tabulation de ligne (NE PAS confondre avec la tabulation de caractère \t qui est \u0009 )
  • \ u000C -> stream de formulaire ( \f )
  • \ u000D -> retour chariot ( \r )
  • \ u0085 -> prochaine ligne (NEL)
  • \ u2028 -> séparateur de ligne
  • \ u2029 -> séparateur de paragraphe

Comme vous le voyez, \r\n est placé au début de regex, ce qui garantit que regex essaiera d’abord de correspondre à cette paire , et seulement si cela échoue, il essaiera de faire correspondre les séparateurs de lignes à un seul caractère .


Donc, si vous voulez diviser sur séparateur de ligne, utilisez split("\\R") .

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

Si vous souhaitez traiter une ou plusieurs lignes vides, utilisez-les comme séparateur unique split("\\R+") .

 Ssortingng.split(System.getProperty("line.separator")); 

Cela devrait être indépendant du système

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

Pour toutes les lignes non vides, utilisez:

 Ssortingng.split("[\r\n]+") 

Peut-être que cela fonctionnerait:

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

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

Pour préserver les lignes vides de l’utilisation écrasée:

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

Toutes les réponses données ici ne respectent en fait pas la définition de Javas des nouvelles lignes, comme indiqué par exemple dans BufferedReader # readline. Java accepte \n , \r et \r\n comme nouvelle ligne. Certaines réponses correspondent à plusieurs lignes vides ou à des fichiers mal formés. Par exemple. \n\r\n en utilisant [\r\n]+ donnerait deux lignes.

 Ssortingng lines[] = ssortingng.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 Javas d’une nouvelle ligne telle que par exemple le BufferedReader l’utilise
  • il ne correspond pas à plusieurs nouvelles lignes
  • il ne supprime pas les lignes vides à la fin

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

essayez de faire textAreaDoc.insertSsortingng (int, Ssortingng, AtsortingbuteSet) à la fin?

Si, pour une raison quelconque, vous ne souhaitez pas utiliser Ssortingng.split (par exemple, en raison d’ expressions régulières ) et que vous souhaitez utiliser la functional programming sous Java 8 ou une version ultérieure:

 List lines = new BufferedReader(new SsortingngReader(ssortingng)) .lines() .collect(Collectors.toList()); 

Ssortingng lines[] =Ssortingng.split( System.lineSeparator())

Après des tentatives infructueuses sur la base de toutes les solutions données. Je remplace \n par un mot spécial et ensuite divisé. Pour moi, la suite a fait l’affaire:

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

Je n’ai pas pu reproduire l’exemple donné dans la question. Mais je suppose que cette logique peut être appliquée.

En guise d’alternative aux réponses précédentes, l’API Splitter guava peut être utilisée si d’autres opérations doivent être appliquées aux lignes résultantes, comme le découpage de lignes ou le filtrage de lignes vides:

 import com.google.common.base.Splitter; Iterable split = Splitter.onPattern("\r?\n").sortingmResults().omitEmptySsortingngs().split(docStr); 

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

Une nouvelle ligne de méthode a été introduite dans la classe Ssortingng dans java-11 , qui renvoie Stream

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

Les terminateurs de ligne reconnus sont des sauts de ligne “\ n” (U + 000A), un retour chariot “\ r” (U + 000D) et un retour chariot 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 

Ssortingng # lines ()

  • essayez cet espoir, il vous a été utile

  Ssortingng 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"); 

Il existe trois conventions différentes (on pourrait 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 pour l’autre:

Bloc-notes ++

La chose la plus simple est de normaliser le saut de line feed puis de le diviser.

 final Ssortingng[] lines = contents.replace("\r\n", "\n") .replace("\r", "\n") .split("\n", -1); 
 package in.javadomain; public class JavaSplit { public static void main(Ssortingng[] args) { Ssortingng input = "chennai\nvellore\ncoimbatore\nbangalore\narcot"; System.out.println("Before split:\n"); System.out.println(input); Ssortingng[] inputSplitNewLine = input.split("\\n"); System.out.println("\n After split:\n"); for(int i=0; i