J'essaie de diviser le texte en JTextArea
utilisant une expression régulière pour diviser la chaîne par \n
Cependant, cela ne fonctionne pas et j'ai également essayé par \r\n|\r|n
et de nombreuses autres combinaisons d'expressions régulières. 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");
}
Réponses:
Cela devrait vous couvrir:
Il n'y a vraiment que deux nouvelles lignes (UNIX et Windows) dont vous devez vous soucier.
la source
split
par défaut, supprime les chaînes vides de fin si elles résultent d'un fractionnement. Pour désactiver ce mécanisme, vous devez utiliser une version surchargée desplit(regex, limit)
avec une limite négative commetext.split("\\r?\\n", -1)
. Plus d'informations: Java String Split a supprimé les valeurs videsString#split(String regex)
utilise regex (expressions régulières). Depuis Java 8 regex prend en charge\R
qui représente (à partir de la documentation de la classe Pattern ):Nous pouvons donc l'utiliser pour faire correspondre:
\u000D\000A
->\r\n
paire\n
)\t
qui est\u0009
)\f
)\r
)Comme vous le voyez, il
\r\n
est placé au début de l'expression régulière, ce qui garantit que l'expression régulière tentera de faire correspondre cette paire en premier, et seulement si cette correspondance échoue, elle essaiera de faire correspondre les séparateurs de ligne à caractère unique .Donc, si vous voulez diviser l'utilisation du séparateur de ligne
split("\\R")
.Si vous ne souhaitez pas supprimer du tableau résultant les chaînes vides de fin,
""
utilisez-lessplit(regex, limit)
avec unlimit
paramètre négatif commesplit("\\R", -1)
.Si vous souhaitez traiter une ou plusieurs lignes vides continues comme un seul délimiteur
split("\\R+")
.la source
\\R+
, pour éviter tout caractère de fin de ligne qui n'était pas couvert par\\R
seul.Si vous ne voulez pas de lignes vides:
la source
Cela devrait être indépendant du système
la source
Une nouvelle méthode
lines
a été introduite enString
classe dansjava-11, qui renvoieStream<String>
Voici quelques exemples:
Chaîne # lignes ()
la source
Vous n'avez pas à doubler les caractères d'échappement dans les groupes de caractères.
Pour toutes les lignes non vides, utilisez:
la source
\r
et\n
peuvent avoir une ou deux barres obliques inverses; ils fonctionnent de toute façon.'\\'
dans le code devient un'\'
caractère et est ensuite transmise au moteur RegEx, donc"[\\r\\n]"
dans le code devient[\r\n]
en mémoire et RegEx traitera cela. Je ne sais pas exactement comment Java gère RegEx, mais c'est une bonne pratique de passer un modèle de chaîne ASCII "pur" au moteur RegEx et de le laisser traiter plutôt que de passer des caractères binaires."[\r\n]"
devient (hex)0D0A
en mémoire et un moteur RegEx pourrait l'accepter tandis qu'un autre s'étoufferait. Donc, en fin de compte, même si la version Java de RegEx n'en a pas besoin, gardez les doubles barres obliques pour la compatibilitéDans
JDK11
laString
classe a unelines()
méthode:De plus, la documentation poursuit en disant:
Avec cela, on peut simplement faire:
alors si vous voulez un tableau:
Étant donné que cette méthode renvoie un flux, elle propose de nombreuses options pour vous, car elle permet d'écrire une expression concise et déclarative d'opérations éventuellement parallèles.
la source
Peut-être que cela fonctionnerait:
Supprimez les doubles barres obliques inverses du paramètre de la méthode de fractionnement:
la source
Toutes les réponses données ici ne respectent en fait pas la définition Javas des nouvelles lignes comme donnée 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.<sometext>\n\r\n<someothertext>
lors de l'utilisation[\r\n]+
entraînerait deux lignes.En revanche, la réponse ci-dessus a les propriétés suivantes:
la source
Si, pour une raison quelconque, vous ne souhaitez pas utiliser
String.split
(par exemple, en raison d' expressions régulières ) et que vous souhaitez utiliser la programmation fonctionnelle sur Java 8 ou une version plus récente:la source
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
pour un tableau au lieu d'une liste. La bonne chose à propos de cette solution est qu'elleBufferedReader
connaît toutes sortes de terminateurs similaires, donc elle peut gérer du texte dans toutes sortes de formats. (La plupart des solutions basées sur les expressions rationnelles publiées ici ne répondent pas à cet égard.)Pour éviter que les lignes vides ne soient écrasées, utilisez:
la source
Le code ci-dessus ne fait en fait rien de visible - il calcule simplement puis décharge 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?
la source
Comme alternative aux réponses précédentes, l'
Splitter
API de goyave peut être utilisée si d'autres opérations doivent être appliquées aux lignes résultantes, comme le découpage des lignes ou le filtrage des lignes vides:Notez que le résultat est un
Iterable
et non un tableau.la source
String lines[] =String.split( System.lineSeparator())
la source
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, la suite a fait l'affaire:Je n'ai pas pu reproduire l'exemple donné dans la question. Mais, je suppose que cette logique peut être appliquée.
la source
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 une partie de la réponse de Pshemo ici:
la source
la source
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 contre l'autre:
La chose la plus simple est de normaliser
line feed
puis de diviser.la source
Il y a un nouveau garçon dans la ville, vous n'avez donc pas besoin de faire face à toutes les complexités ci-dessus. À partir de JDK 11 , il suffit d'écrire en une seule ligne de code, il divisera les lignes et vous renverra un flux de chaîne.
Quelques références. https://docs.oracle.com/en/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. Codage heureux.
la source
la source