Jak mogę zastąpić wszystkie podziały wiersza z ciągu znaków w Javie w taki sposób, aby działał w systemach Windows i Linux (tzn. Nie występują problemy specyficzne dla systemu operacyjnego dotyczące powrotu karetki / przesunięcia wiersza / nowej linii itp.)?
Próbowałem (uwaga readFileAsString to funkcja, która odczytuje plik tekstowy do ciągu):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
ale to nie działa.
Jak można to zrobić?
java
string
newline
line-breaks
haker drzewa
źródło
źródło
myString.trim().replaceAll("[\n]{2,}", "\n")
Lub zastąpić jedną spacjąmyString.trim().replaceAll("[\n]{2,}", " ")
Odpowiedzi:
Musisz ustawić
text
na wynikitext.replace()
:Jest to konieczne, ponieważ ciągi są niezmienne - wywołanie
replace
nie zmienia oryginalnego ciągu, zwraca nowy, który został zmieniony. Jeśli nie przypiszesz wynikutext
, nowy ciąg zostanie utracony, a śmieci zostaną zebrane.Jeśli chodzi o uzyskanie ciągu nowego wiersza dla dowolnego środowiska - jest to dostępne przez wywołanie
System.getProperty("line.separator")
.źródło
replace()
Sposób powraca do pożądanego rezultatu. Zobacz także dokumentację API: java.sun.com/javase/6/docs/api/java/lang/… Edycja: ah sam już to późniejtext = text.replace("\r\n", " ").replace("\n", " ");
jest to lepsze rozwiązanie: w przeciwnym razie słowa zostaną „sklejone” ze sobą (bez zamiany pojedynczej spacji)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
przyjmuje wyrażenia regularne,replace
przyjmuje dosłowne ciągi znaków, oba zastępują wszystkie wystąpienia.Jak zauważono w innych odpowiedziach, twój kod nie działa przede wszystkim dlatego,
String.replace(...)
że nie zmienia celuString
. (Nie może - ciągi Java są niezmienne!) Wreplace
rzeczywistości polega na utworzeniu i zwróceniu nowegoString
obiektu ze zmienionymi znakami zgodnie z wymaganiami. Ale twój kod wyrzuca toString
...Oto kilka możliwych rozwiązań. To, który jest najbardziej poprawny, zależy od tego, co dokładnie próbujesz zrobić.
Po prostu usuwa wszystkie znaki nowej linii. Nie radzi sobie z zakończeniami linii w systemie Windows lub Mac.
Usuwa wszystkie terminatory linii dla bieżącej platformy. Nie dotyczy to przypadku, gdy próbujesz przetworzyć (na przykład) plik UNIX w systemie Windows lub odwrotnie.
Usuwa wszystkie terminatory linii w systemie Windows, UNIX lub Mac. Jeśli jednak plik wejściowy to tekst, spowoduje to konkatenację słów; na przykład
staje się
Więc możesz chcieć to zrobić:
który zastępuje każde zakończenie linii spacją. Od wersji Java 8 możesz to również zrobić:
A jeśli chcesz zastąpić wiele separatorów linii jedną spacją:
źródło
Jeśli chcesz usunąć tylko terminatory linii, które są ważne w bieżącym systemie operacyjnym, możesz to zrobić:
Jeśli chcesz się upewnić, że usunąłeś separatory linii, możesz to zrobić w następujący sposób:
Lub nieco bardziej gadatliwy, ale mniej zwrotny:
źródło
text.replaceAll("(\\r|\\n)+", " ")
i (zakładając, że w Javie jest zachłanny?), Będziesz mieć rozwiązanie z jedną spacją dla każdej sekwencji nowych znaków wiersza.Ta funkcja normalizuje wszystkie białe spacje, w tym łamanie linii, do pojedynczych spacji. Nie do końca to, o co pytało pierwotne pytanie, ale w wielu przypadkach może zrobić dokładnie to, co jest potrzebne:
źródło
Myślę, że byłoby to skuteczne
źródło
Po wielu poszukiwaniach działał dla mnie idealnie, ponieważ zawiodłem przy każdej innej linii.
źródło
Podziały linii nie są takie same w systemach Windows / Linux / Mac. Powinieneś użyć System.getProperties z atrybutem line.separator.
źródło
.replace zwraca nowy ciąg, ciągi w Javie są niezmienne.
źródło
Możesz przeczytać swój plik za pomocą
BufferedReader
. Ta klasa może dzielić dane wejściowe na pojedyncze linie, które można dowolnie zestawiać. SposóbBufferedReader
działania automatycznie rozpoznaje konwencje zakończenia linii w środowiskach Linux, Windows i MacOS, niezależnie od bieżącej platformy.W związku z tym:
Zauważ, że
readLine()
nie zawiera terminatora linii w zwracanym ciągu. Powyższy kod dodaje spację, aby uniknąć sklejenia ze sobą ostatniego słowa linii i pierwszego słowa następnego wiersza.źródło
Mimo że definicja trim () w witrynie internetowej oracle brzmi „Zwraca kopię ciągu, z pominięciem początkowych i końcowych białych znaków”.
dokumentacja pomija stwierdzenie, że nowe znaki linii (wiodące i końcowe) również zostaną usunięte.
W skrócie
String text = readFileAsString("textfile.txt").trim();
będzie również dla ciebie działać. (Sprawdzone w Javie 6)źródło
Wydaje mi się dziwne, że (Apache) StringUtils nie został jeszcze tutaj opisany.
możesz usunąć wszystkie znaki nowej linii (lub dowolne inne wystąpienia podciągów w tym przypadku) z ciągu przy użyciu tej
.replace
metodyTa linia zastąpi wszystkie nowe wiersze pustym ciągiem.
ponieważ newline jest technicznie znakiem, możesz opcjonalnie użyć
.replaceChars
metody, która zastąpi znakiźródło
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Do Twojej wiadomości, jeśli chcesz zastąpić jednoczesne łamanie linii muti pojedynczym łamaniem linii, możesz użyć
Lub zastąp jedną spacją
źródło
Za pomocą apache commons IOUtils można iterować po linii i dołączać każdą linię do StringBuilder. I nie zapomnij zamknąć InputStream
źródło
Możesz użyć ogólnych metod, aby zastąpić dowolny znak dowolnym znakiem.
źródło
org.apache.commons.lang.StringUtils # chopNewline
źródło
Spróbuj to zrobić:
źródło
\n
nie będzie\r\n
już żadnego, jeśli zamienisz \ n i jest \\ n zostanie on zastąpiony, więc pozostanie tylko \.