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");
}
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).
Si vous ne voulez pas de lignes vides:
String.split("[\\r\\n]+")
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 à:
\u000D\000A
-> \r\n
paire \n
)\t
qui est \u0009
)\f
)\r
)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+")
.
String.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:
String.split("[\r\n]+")
Peut-être que cela fonctionnerait:
Supprimez les doubles barres obliques inverses du paramètre de la méthode split:
split = docStr.split("\n");
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
Pour éviter que des lignes vides ne soient écrasées, utilisez:
String lines[] = String.split("\\r?\\n", -1);
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:
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?
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());
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.
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.
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.
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");
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:
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);
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")
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.