Saya mencoba untuk membagi teks dalam JTextArea
menggunakan regex untuk membagi String dengan \n
Namun, ini tidak berhasil dan saya juga mencoba oleh \r\n|\r|n
dan banyak kombinasi regex lainnya. Kode:
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");
}
Jawaban:
Ini harus melindungi Anda:
Hanya ada dua baris baru (UNIX dan Windows) yang perlu Anda khawatirkan.
sumber
split
secara default menghapus string kosong jika mereka hasil split. Untuk mematikan mekanisme ini, Anda perlu menggunakan versi overloadsplit(regex, limit)
dengan batas negatif sepertitext.split("\\r?\\n", -1)
. Info selengkapnya: Java String split menghapus nilai kosongString#split(String regex)
Metode menggunakan regex (ekspresi reguler). Karena dukungan Java 8 regex\R
yang mewakili (dari dokumentasi kelas Pola ):Jadi kita bisa menggunakannya untuk mencocokkan:
\u000D\000A
->\r\n
pasangan\n
)\t
yang ada\u0009
)\f
)\r
)Seperti yang Anda lihat
\r\n
ditempatkan pada awal regex yang memastikan bahwa regex akan mencoba untuk mencocokkan pasangan ini terlebih dahulu, dan hanya jika pertandingan itu gagal ia akan mencoba untuk mencocokkan pemisah garis karakter tunggal .Jadi jika Anda ingin membagi menggunakan pemisah garis
split("\\R")
.Jika Anda tidak ingin menghapus dari array array dihasilkan string kosong
""
gunakansplit(regex, limit)
denganlimit
parameter negatif sepertisplit("\\R", -1)
.Jika Anda ingin memperlakukan satu atau lebih lanjutkan baris kosong sebagai pembatas tunggal
split("\\R+")
.sumber
\\R+
, untuk menghindari karakter end-of-line yang tidak tercakup oleh\\R
sendirian.Jika Anda tidak ingin baris kosong:
sumber
Ini harus independen dari sistem
sumber
Metode baru
lines
telah diperkenalkan keString
kelas dijava-11, yang kembaliStream<String>
Berikut ini beberapa contoh:
String # lines ()
sumber
Anda tidak harus menggandakan karakter melarikan diri dalam grup karakter.
Untuk semua saluran yang tidak kosong gunakan:
sumber
\r
dan\n
dapat memiliki satu atau dua garis miring terbalik; mereka bekerja dengan cara baik.'\\'
dalam kode menjadi'\'
karakter dan kemudian diteruskan ke mesin RegEx, sehingga"[\\r\\n]"
dalam kode menjadi[\r\n]
dalam memori dan RegEx akan memprosesnya. Saya tidak tahu bagaimana tepatnya Java menangani RegEx, tetapi itu adalah praktik yang baik untuk meneruskan pola string ASCII "murni" ke mesin RegEx dan membiarkannya memproses daripada melewati karakter biner."[\r\n]"
menjadi (hex)0D0A
dalam memori dan satu mesin RegEx mungkin menerimanya sementara yang lain akan tersedak. Jadi intinya adalah bahwa walaupun rasa Java dari RegEx tidak membutuhkannya, tetapDalam
JDK11
satuString
kelas memilikilines()
metode:Selanjutnya, dokumentasi selanjutnya mengatakan:
Dengan yang satu ini bisa dilakukan:
maka jika Anda menginginkan sebuah array:
Mengingat metode ini mengembalikan Stream pada banyak pilihan bagi Anda karena memungkinkan seseorang untuk menulis ekspresi singkat dan deklaratif dari operasi yang mungkin paralel.
sumber
Mungkin ini akan berhasil:
Hapus garis miring terbalik ganda dari parameter metode split:
sumber
Semua jawaban yang diberikan di sini sebenarnya tidak menghormati definisi Javas dari baris baru seperti yang diberikan dalam contoh BufferedReader # readline. Java menerima
\n
,\r
dan\r\n
sebagai baris baru. Beberapa jawaban cocok dengan beberapa baris kosong atau file cacat. Misalnya.<sometext>\n\r\n<someothertext>
saat menggunakan[\r\n]+
akan menghasilkan dua baris.Sebaliknya, jawaban di atas memiliki properti berikut:
sumber
Jika, karena alasan tertentu, Anda tidak ingin menggunakan
String.split
(misalnya, karena ekspresi reguler ) dan Anda ingin menggunakan pemrograman fungsional pada Java 8 atau yang lebih baru:sumber
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
untuk array, bukan daftar. Yang menyenangkan tentang solusi ini adalah yangBufferedReader
mengetahui tentang semua jenis terminator yang sejenis, sehingga dapat menangani teks dalam semua jenis format. (Sebagian besar solusi berbasis regex yang diposting di sini gagal dalam hal ini.)Untuk menjaga agar baris kosong tidak tergencet gunakan:
sumber
Kode di atas tidak benar-benar melakukan apa pun yang terlihat - itu hanya perhitungan lalu dump perhitungan. Apakah kode yang Anda gunakan, atau hanya contoh untuk pertanyaan ini?
coba lakukan textAreaDoc.insertString (int, String, AttributeSet) di akhir?
sumber
Sebagai alternatif dari jawaban sebelumnya,
Splitter
API jambu biji dapat digunakan jika operasi lain diterapkan pada garis yang dihasilkan, seperti memotong garis atau menyaring garis kosong:Perhatikan bahwa hasilnya adalah
Iterable
bukan array.sumber
String lines[] =String.split( System.lineSeparator())
sumber
Setelah upaya yang gagal berdasarkan semua solusi yang diberikan. Saya ganti
\n
dengan beberapa kata khusus dan kemudian dibagi. Bagi saya mengikuti melakukan trik:Saya tidak bisa meniru contoh yang diberikan dalam pertanyaan. Tapi, saya kira logika ini bisa diterapkan.
sumber
Jawaban di atas tidak membantu saya di Android, berkat respons Pshemo yang bekerja untuk saya di Android. Saya akan meninggalkan beberapa jawaban Pshemo di sini:
sumber
sumber
Ada tiga konvensi yang berbeda (dapat dikatakan bahwa itu adalah standar de facto ) untuk menetapkan dan menampilkan jeda baris:
carriage return
+line feed
line feed
carriage return
Di beberapa editor teks, dimungkinkan untuk bertukar satu dengan yang lain:
Hal paling sederhana adalah menormalkan
line feed
dan kemudian membelah.sumber
Ada anak baru di kota, jadi Anda tidak perlu berurusan dengan semua kompleksitas di atas. Dari JDK 11 dan seterusnya , hanya perlu menulis sebagai satu baris kode, itu akan memecah baris dan mengembalikan Anda Stream of String.
Beberapa referensi. 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 /
Saya harap ini akan membantu seseorang. Selamat coding.
sumber
sumber