Bagaimana saya bisa mengganti semua jeda baris dari string di Jawa sedemikian rupa yang akan bekerja pada Windows dan Linux (yaitu tidak ada masalah khusus OS dari carriage return / line feed / baris baru dll.)?
Saya sudah mencoba (note readFileAsString adalah fungsi yang membaca file teks menjadi sebuah String):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
tapi ini sepertinya tidak berhasil.
Bagaimana ini bisa dilakukan?
java
string
newline
line-breaks
peretas pohon
sumber
sumber
myString.trim().replaceAll("[\n]{2,}", "\n")
atau mengganti dengan satu ruangmyString.trim().replaceAll("[\n]{2,}", " ")
Jawaban:
Anda perlu mengatur
text
hasiltext.replace()
:Ini diperlukan karena String tidak dapat diubah - panggilan
replace
tidak mengubah String asli, tetapi mengembalikan String baru yang telah diubah. Jika Anda tidak menetapkan hasilnyatext
, maka String baru itu hilang dan sampah dikumpulkan.Adapun untuk mendapatkan String baris baru untuk lingkungan apa pun - yang tersedia dengan menelepon
System.getProperty("line.separator")
.sumber
replace()
Metode mengembalikan hasil yang diinginkan. Juga lihat dokumen API: java.sun.com/javase/6/docs/api/java/lang/... Sunting: ah Anda sudah mengeditnya sendiri setelahnya :)text = text.replace("\r\n", " ").replace("\n", " ");
merupakan solusi yang lebih baik: jika tidak kata-kata akan "direkatkan" satu sama lain (tanpa penggantian satu ruang)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
mengambil regex,replace
mengambil string literal, keduanya menggantikan semua kejadian.Seperti disebutkan dalam jawaban lain, kode Anda tidak berfungsi terutama karena
String.replace(...)
tidak mengubah targetString
. (Tidak bisa - string Java tidak dapat diubah!) Yangreplace
sebenarnya dilakukan adalah membuat dan mengembalikanString
objek baru dengan karakter yang diubah sesuai kebutuhan. Tetapi kode Anda kemudian membuang ituString
...Berikut adalah beberapa solusi yang mungkin. Yang mana yang paling benar tergantung pada apa yang sebenarnya Anda coba lakukan.
Cukup hapus semua karakter baris baru. Ini tidak mengatasi pemutusan jalur Windows atau Mac.
Menghapus semua terminator saluran untuk platform saat ini. Ini tidak mengatasi kasus di mana Anda mencoba memproses (misalnya) file UNIX di Windows, atau sebaliknya.
Menghapus semua terminator jalur Windows, UNIX atau Mac. Namun, jika file input adalah teks, ini akan menyatukan kata-kata; misalnya
menjadi
Jadi, Anda mungkin benar-benar ingin melakukan ini:
yang menggantikan setiap terminator garis dengan spasi. Karena Java 8 Anda juga dapat melakukan ini:
Dan jika Anda ingin mengganti beberapa pemisah garis dengan satu spasi:
sumber
Jika Anda ingin menghapus hanya terminator garis yang valid pada OS saat ini, Anda bisa melakukan ini:
Jika Anda ingin memastikan Anda menghapus pemisah garis apa pun, Anda dapat melakukannya seperti ini:
Atau, sedikit lebih bertele-tele, tetapi kurang regexy:
sumber
text.replaceAll("(\\r|\\n)+", " ")
dan (dengan asumsi serakah adalah default di Jawa?) Anda akan memiliki solusi dengan hanya satu ruang untuk setiap urutan barisan baris baru.Fungsi ini menormalkan ke bawah semua spasi putih, termasuk jeda baris, ke ruang tunggal. Tidak persis apa yang ditanyakan oleh pertanyaan awal, tetapi cenderung melakukan apa yang dibutuhkan dalam banyak kasus:
sumber
Kurasa ini akan efisien
sumber
Bekerja dengan sempurna untuk saya setelah mencari banyak, setelah gagal dengan setiap baris lainnya.
sumber
Linebreak tidak sama di bawah windows / linux / mac. Anda harus menggunakan System.getProperties dengan atribut line.separator.
sumber
.replace mengembalikan string baru, string di Java tidak dapat diubah.
sumber
Anda mungkin ingin membaca file Anda dengan
BufferedReader
. Kelas ini dapat memecah input menjadi garis-garis individual, yang dapat Anda rakit sesuka hati. JalanBufferedReader
operasinya mengenali konvensi garis akhir dari dunia Linux, Windows dan MacOS secara otomatis, terlepas dari platform saat ini.Karenanya:
Perhatikan bahwa
readLine()
tidak termasuk terminator garis dalam string yang dikembalikan. Kode di atas menambahkan spasi untuk menghindari perekatan kata terakhir dari sebuah baris dan kata pertama dari baris berikutnya.sumber
Meskipun definisi trim () di situs web oracle adalah "Mengembalikan salinan string, dengan spasi spasi awalan dan jejak dihapus."
dokumentasi tidak menyebutkan bahwa karakter baris baru (depan dan belakang) juga akan dihapus.
Singkatnya
String text = readFileAsString("textfile.txt").trim();
juga akan bekerja untuk Anda. (Diperiksa dengan Java 6)sumber
Saya merasa aneh bahwa (Apache) StringUtils belum dibahas di sini.
Anda dapat menghapus semua baris baru (atau kejadian lain dari substring dalam hal ini) dari string menggunakan
.replace
metode iniBaris ini akan mengganti semua baris baru dengan string kosong.
karena baris baru secara teknis adalah karakter, Anda dapat menggunakan
.replaceChars
metode yang akan menggantikan karakter secara opsionalsumber
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
FYI jika Anda ingin mengganti muti-linebreak secara simultan dengan single line break maka Anda dapat menggunakannya
Atau ganti dengan satu ruang
sumber
Anda dapat menggunakan apache commons IOUtils untuk beralih melalui baris dan menambahkan setiap baris ke StringBuilder. Dan jangan lupa untuk menutup InputStream
sumber
Anda dapat menggunakan metode umum untuk mengganti arang apa pun dengan arang apa pun.
sumber
org.apache.commons.lang.StringUtils # chopNewline
sumber
Coba lakukan ini:
sumber
\n
tidak ada\r\n
lagi jika Anda mengganti \ n dan ada \\ n itu akan diganti sehingga hanya \ akan tetap.