Ich versuche, Text in einem regulären Ausdruck JTextArea
zu teilen, um den String nach zu teilen. \n
Dies funktioniert jedoch nicht und ich habe es auch mit \r\n|\r|n
und vielen anderen Kombinationen von regulären Ausdrücken versucht . 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");
}
Antworten:
Dies sollte Sie abdecken:
Es gibt wirklich nur zwei Zeilenumbrüche (UNIX und Windows), über die Sie sich Sorgen machen müssen.
quelle
split
standardmäßig werden nachfolgende leere Zeichenfolgen entfernt, wenn sie das Ergebnis einer Teilung sind. Um diesen Mechanismus auszuschalten, müssen Sie eine überladene Version vonsplit(regex, limit)
mit einem negativen Grenzwert wie verwendentext.split("\\r?\\n", -1)
. Weitere Informationen: Java String Split entfernt leere WerteString#split(String regex)
Methode verwendet Regex (reguläre Ausdrücke). Da Java 8 Regex unterstützt,\R
was darstellt (aus der Dokumentation der Pattern-Klasse ):Wir können es also verwenden, um Folgendes abzugleichen:
\u000D\000A
->\r\n
Paar\n
)\t
die ist\u0009
)\f
)\r
)Wie Sie sehen,
\r\n
wird es am Anfang von Regex platziert, wodurch sichergestellt wird, dass Regex zuerst versucht, mit diesem Paar übereinzustimmen , und nur wenn diese Übereinstimmung fehlschlägt, wird versucht, einzelne Zeichenzeilentrennzeichen abzugleichen.Wenn Sie also das Zeilentrennzeichen aufteilen möchten, verwenden Sie
split("\\R")
.Wenn Sie keine leeren Zeichenfolgen aus dem resultierenden Array entfernen möchten,
""
verwenden Siesplit(regex, limit)
mit negativenlimit
Parametern wiesplit("\\R", -1)
.Wenn Sie eine oder mehrere fortgesetzte Leerzeilen als einzelnes Trennzeichen behandeln möchten, verwenden Sie diese
split("\\R+")
.quelle
\\R+
Ende habe ich mich getrennt , um Zeilenendezeichen zu vermeiden, die nicht\\R
alleine abgedeckt wurden.Wenn Sie keine Leerzeilen möchten:
quelle
Dies sollte systemunabhängig sein
quelle
Für
lines
denString
Unterricht in wurde eine neue Methode eingeführtJava-11, die zurückkehrtStream<String>
Hier einige Beispiele:
String # lines ()
quelle
Sie müssen Escapezeichen in Zeichengruppen nicht verdoppeln.
Verwenden Sie für alle nicht leeren Zeilen:
quelle
\r
und\n
kann ein oder zwei Backslashes haben; Sie arbeiten so oder so.'\\'
im Code wird zu einem'\'
Zeichen und wird dann an die RegEx-Engine übergeben, sodass der"[\\r\\n]"
Code[\r\n]
im Speicher gespeichert wird und RegEx dies verarbeitet. Ich weiß nicht, wie genau Java mit RegEx umgeht, aber es empfiehlt sich, ein "reines" ASCII-Zeichenfolgenmuster an die RegEx-Engine zu übergeben und es verarbeiten zu lassen, anstatt Binärzeichen zu übergeben."[\r\n]"
wird (hex)0D0A
im Speicher und eine RegEx-Engine akzeptiert dies möglicherweise, während eine andere erstickt. Das Fazit ist also, dass selbst wenn Javas Geschmack von RegEx sie nicht benötigt, doppelte Schrägstriche aus KompatibilitätsgründenIn
JDK11
derString
Klasse gibt es einelines()
Methode:In der Dokumentation heißt es weiter:
Damit kann man einfach machen:
dann, wenn Sie ein Array wollen:
Wenn diese Methode einen Stream zurückgibt, stehen Ihnen viele Optionen zur Verfügung, da Sie einen präzisen und deklarativen Ausdruck möglicherweise paralleler Operationen schreiben können .
quelle
Vielleicht würde das funktionieren:
Entfernen Sie die doppelten Backslashes aus dem Parameter der Split-Methode:
quelle
Alle hier gegebenen Antworten berücksichtigen nicht die Javas-Definition neuer Zeilen, wie sie beispielsweise in BufferedReader # readline angegeben ist. Java akzeptiert
\n
,\r
und\r\n
als neue Zeile. Einige der Antworten stimmen mit mehreren Leerzeilen oder fehlerhaften Dateien überein. Z.B.<sometext>\n\r\n<someothertext>
bei Verwendung[\r\n]+
würde in zwei Zeilen führen.Im Gegensatz dazu hat die obige Antwort die folgenden Eigenschaften:
quelle
Wenn Sie aus irgendeinem Grund nicht verwenden möchten
String.split
(z. B. aufgrund regulärer Ausdrücke ) und die funktionale Programmierung unter Java 8 oder höher verwenden möchten:quelle
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
für ein Array anstelle einer Liste. Das Schöne an dieser Lösung ist,BufferedReader
dass sie alle Arten von Terminatoren kennt, sodass sie Text in allen möglichen Formaten verarbeiten kann. (Die meisten der hier veröffentlichten Regex-basierten Lösungen sind in dieser Hinsicht unzureichend.)Um zu verhindern, dass leere Zeilen gequetscht werden, verwenden Sie:
quelle
Der obige Code macht eigentlich nichts Sichtbares - er berechnet nur die Daten und gibt dann die Berechnung aus. Ist es der Code, den Sie verwendet haben, oder nur ein Beispiel für diese Frage?
Versuchen Sie am Ende textAreaDoc.insertString (int, String, AttributeSet) auszuführen.
quelle
Alternativ zu den vorherigen Antworten kann die Guava-
Splitter
API verwendet werden, wenn andere Operationen auf die resultierenden Zeilen angewendet werden sollen, z. B. das Trimmen von Zeilen oder das Filtern leerer Zeilen:Beachten Sie, dass das Ergebnis ein
Iterable
und kein Array ist.quelle
String lines[] =String.split( System.lineSeparator())
quelle
Nach fehlgeschlagenen Versuchen auf Basis aller gegebenen Lösungen. Ich ersetze
\n
durch ein spezielles Wort und teile dann. Für mich hat folgendes den Trick gemacht:Ich konnte das in der Frage angegebene Beispiel nicht wiederholen. Aber ich denke, diese Logik kann angewendet werden.
quelle
Die obigen Antworten haben mir auf Android nicht geholfen, dank der Pshemo- Antwort, die auf Android für mich funktioniert hat. Ich werde hier einige Antworten von Pshemo hinterlassen :
quelle
quelle
Es gibt drei verschiedene Konventionen (man könnte sagen, dass dies de facto Standards sind), um einen Zeilenumbruch festzulegen und anzuzeigen:
carriage return
+line feed
line feed
carriage return
In einigen Texteditoren ist es möglich, einen gegen den anderen auszutauschen:
Am einfachsten ist es, zu normalisieren
line feed
und dann zu teilen.quelle
Es gibt einen neuen Jungen in der Stadt, so dass Sie sich nicht mit allen oben genannten Komplexitäten auseinandersetzen müssen. Ab JDK 11 müssen Sie nur noch als einzelne Codezeile schreiben. Dadurch werden die Zeilen geteilt und Sie erhalten einen Stream of String zurück.
Einige Referenzen. https://docs.oracle.com/de/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -Funktionen-und-Apis-in-JDK-11 /
Ich hoffe, das wird jemandem helfen. Viel Spaß beim Codieren.
quelle
quelle