Java'daki bir dosyadan satır sonları nasıl kaldırılır?


258

Java'daki bir dizeden gelen tüm satır sonlarını Windows ve Linux üzerinde çalışacak şekilde nasıl değiştirebilirim (örneğin, satır başı / satır besleme / yeni satır vb. İşletim sistemine özgü sorunlar yok)?

Ben denedim (not readFileAsString bir String içine bir metin dosyasını okuyan bir işlevdir):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

ama bu işe yaramıyor gibi görünüyor.

Bu nasıl yapılabilir?


Tüm satır sonlarını ortadan kaldırmak istiyor musunuz? Yoksa standart bir çözüme dönüştürmek mi istiyorsunuz?
helios

4
Tüm satır beslemelerini silmek istiyorsanız, tüm \ n AND all \ r öğelerini kaldırın (çünkü Windows satır aralığı \ r \ n).
helios

Hey, FYI eşzamanlı muti-linebreaks'ları tek satır sonu myString.trim().replaceAll("[\n]{2,}", "\n") ile değiştirmek istiyorsanız, o zaman kullanabilirsiniz veya tek bir boşlukla değiştirebilirsiniz myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

Yanıtlar:


435

Aşağıdaki textsonuçlara ayarlamanız gerekir text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

Bu, Dizeler değiştirilemez olduğu için gereklidir - çağrı replaceorijinal Dizeyi değiştirmez, değiştirilen yeni bir tane döndürür. Sonucu olarak atamazsanız, textyeni Dize kaybolur ve çöp toplanır.

Herhangi bir ortam için newline String'i almaya gelince - bu çağrılarak kullanılabilir System.getProperty("line.separator").


1
+1, doğru. Nedeni ile ilgili olarak: String değişmezdir . replace()Yöntem döner istenen sonucu. Ayrıca API belgelerine de bakın: java.sun.com/javase/6/docs/api/java/lang/… Düzenleme: ah bunu daha sonra kendiniz düzenlediniz :)
BalusC

75
Belki text = text.replace("\r\n", " ").replace("\n", " ");daha iyi bir çözümdür: Aksi takdirde kelimeler birbirine "yapıştırılacaktır" (tek boşlukla değiştirilmeden).
Bart Kiers

9
Herhangi bir işletim sistemi için yeni satırları düzgün şekilde eşleştirmek için köşeli parantezleri de kullanabilirsiniz:.replaceAll("[\\r\\n]+", "")
Yeti

2
Soru TÜM olayları değiştirmek istediğinden, çözüm oldukçatext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@basZero replaceAllnormal ifadeyi alır, replacegerçek dizeleri alır, her ikisi de tüm olayların yerini alır .
Joonas Vali

220

Diğer yanıtlar belirtildiği gibi, kodunuz çalışmıyor öncelikle çünkü String.replace(...)hedef değişmez String. (Bu olamaz - Java dizeleri değişmez!) replaceAslında yaptığı, gerektiğinde Stringkarakterleri değiştirilmiş yeni bir nesne oluşturmak ve döndürmektir . Ancak kodunuz bunu atar String...


İşte bazı olası çözümler. Hangisinin en doğru olduğu tam olarak ne yapmaya çalıştığınıza bağlıdır.

// #1
text = text.replace("\n", "");

Tüm yeni satır karakterlerini kaldırır. Bu, Windows veya Mac satır sonlandırmalarıyla başa çıkmaz.

// #2
text = text.replace(System.getProperty("line.separator"), "");

Geçerli platform için tüm satır sonlandırıcılarını kaldırır. Bu, Windows'ta bir UNIX dosyasını (veya tam tersini) işlemeye çalıştığınız durumla başa çıkmaz.

// #3
text = text.replaceAll("\\r|\\n", "");

Tüm Windows, UNIX veya Mac hat sonlandırıcılarını kaldırır. Ancak, giriş dosyası metinse, bu sözcükleri birleştirir; Örneğin

Goodbye cruel
world.

olur

Goodbye cruelworld.

Yani aslında bunu yapmak isteyebilirsiniz:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

her satır sonlandırıcıyı bir boşlukla değiştirir. Java 8'den beri bunu da yapabilirsiniz:

// #5
text = text.replaceAll("\\R", " ");

Ve birden çok satır ayırıcıyı bir boşlukla değiştirmek istiyorsanız:

// #6
text = text.replaceAll("\\R+", " ");

1
Bu MÜKEMMEL bir cevaptır. Java 8 örnekleri için şeref. Yardım için teşekkürler!
HankNessip

22

Yalnızca geçerli işletim sisteminde geçerli olan satır sonlandırıcılarını kaldırmak istiyorsanız, bunu yapabilirsiniz:

text = text.replaceAll(System.getProperty("line.separator"), "");

Herhangi bir çizgi ayırıcısını kaldırdığınızdan emin olmak istiyorsanız, bunu şu şekilde yapabilirsiniz:

text = text.replaceAll("\\r|\\n", "");

Veya, biraz daha ayrıntılı, ancak daha az düzenli:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");

2
Kelimeyi birbirine yapıştırmamak için (Kaleb'ın cevabına yapılan yorumlarda tartışıldığı gibi) normal ifade yaklaşımı değiştirilebilir text.replaceAll("(\\r|\\n)+", " ")ve (Java'da açgözlülük varsayılan olarak kabul edilir mi?) Yeni satır karakterlerinin her dizisi için sadece bir boşluk içeren bir çözümünüz olacaktır .
Jørn Schou-Rode

19

Bu işlev satır sonları dahil tüm boş alanları tek boşluklara normalleştirir. Orijinal sorunun tam olarak ne istediğini değil, çoğu durumda tam olarak gerekli olanı yapması muhtemeldir:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

14

Bu etkili olur sanırım

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

Yapıştırırken "\ n" karakterlerini kaybetmek yerine tam olarak aynı koda sahip olduğunuzdan emin olun. Çünkü çalışmalı. Belki de sonunda son noktalı virgül (;) unuttum.
JSBach

11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Çok fazla aradıktan sonra, diğer tüm hatlarda başarısız olduktan sonra mükemmel çalıştı.



3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace yeni bir dize döndürür, Java'daki dizeler Değişmezdir.


3

Dosyanızı bir ile okumak isteyebilirsiniz BufferedReader. Bu sınıf, girişi istediğiniz zaman birleştirebileceğiniz ayrı satırlara bölebilir. Çalışma şekli BufferedReader, mevcut platformdan bağımsız olarak Linux, Windows ve MacOS dünyalarının satır sonu kurallarını otomatik olarak tanır.

Dolayısıyla:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

readLine()Döndürülen dizeye satır sonlandırıcıyı dahil etmediğini unutmayın . Yukarıdaki kod, bir satırın son kelimesini ve bir sonraki satırın ilk kelimesini birbirine yapıştırmamak için bir boşluk ekler.


3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Oracle web sitesindeki trim () tanımı "Dizenin ön ve arka boşlukları atlanmış olarak bir kopyasını döndürür."

belgeler, yeni satır karakterlerinin (satır başı ve sondaki) de kaldırılacağını söylemez.

Kısacası String text = readFileAsString("textfile.txt").trim();sizin için de işe yarayacaktır. (Java 6 ile işaretlenmiştir)


1

(Apache) StringUtils tuhaf buluyorum henüz burada kapalı değildi .

.replaceyöntemi kullanarak bir dizeden tüm yeni satırları (veya bu konu için bir alt dizenin diğer oluşumlarını) kaldırabilirsiniz

StringUtils.replace(myString, "\n", "");

Bu satır, tüm yeni satırları boş dize ile değiştirir.

newline teknik olarak bir karakter olduğu için isteğe bağlı olarak .replaceCharskarakterlerin yerine geçecek yöntemi kullanabilirsiniz

StringUtils.replaceChars(myString, '\n', '');

StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford

0

Aynı anda muti-linebreaks'ı tek satır sonu ile değiştirmek isterseniz FYI'yi kullanabilirsiniz.

myString.trim().replaceAll("[\n]{2,}", "\n")

Veya tek bir boşlukla değiştirin

myString.trim().replaceAll("[\n]{2,}", " ")

0

Satır boyunca yineleme yapmak ve her satırı StringBuilder'a eklemek için apache commons IOUtils'i kullanabilirsiniz. Ve InputStream'i kapatmayı unutmayın

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

0

Herhangi bir karakteri herhangi bir karakterle değiştirmek için genel yöntemler kullanabilirsiniz.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}


-2

Bunu yapmayı deneyin:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");

5
Eğer değiştirirseniz \nhiçbir orada \r\nDeğiştirmek \ n ve bir orada \\ n o yüzden sadece \ kalacaktır değiştirilecektir eğer artık.
Rob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.