Como posso substituir todas as quebras de linha de uma string em Java de forma que funcione no Windows e Linux (ou seja, sem problemas específicos do SO de retorno de carro / avanço de linha / nova linha etc.)?
Eu tentei (note readFileAsString é uma função que lê um arquivo de texto em uma String):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
mas isso não parece funcionar.
Como isso pode ser feito?
java
string
newline
line-breaks
hacker de árvores
fonte
fonte
myString.trim().replaceAll("[\n]{2,}", "\n")
ou substitua por um único espaçomyString.trim().replaceAll("[\n]{2,}", " ")
Respostas:
Você precisa definir
text
os resultados detext.replace()
:Isso é necessário porque Strings são imutáveis - a chamada
replace
não altera a String original, retorna uma nova que foi alterada. Se você não atribuir o resultadotext
, essa nova String será perdida e o lixo coletado.Quanto à obtenção da nova linha String para qualquer ambiente - disponível por chamada
System.getProperty("line.separator")
.fonte
replace()
método retorna o resultado desejado. Veja também a documentação da API: java.sun.com/javase/6/docs/api/java/lang/... Edit: ah você já editado que se em seguida :)text = text.replace("\r\n", " ").replace("\n", " ");
seja uma solução melhor: caso contrário, as palavras serão "coladas" umas às outras (sem a substituição de espaço único)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
recebe regex,replace
recebe cadeias literais, ambas substituem todas as ocorrências.Conforme observado em outras respostas, seu código não está funcionando principalmente porque
String.replace(...)
não altera o destinoString
. (Não pode - as seqüências Java são imutáveis!) O quereplace
realmente faz é criar e retornar um novoString
objeto com os caracteres alterados conforme necessário. Mas seu código joga fora issoString
...Aqui estão algumas soluções possíveis. Qual é o mais correto depende do que exatamente você está tentando fazer.
Simplesmente remove todos os caracteres da nova linha. Isso não lida com as terminações de linha do Windows ou Mac.
Remove todos os terminadores de linha da plataforma atual. Isso não lida com o caso em que você está tentando processar (por exemplo) um arquivo UNIX no Windows ou vice-versa.
Remove todos os terminadores de linha do Windows, UNIX ou Mac. No entanto, se o arquivo de entrada for texto, isso concatenará as palavras; por exemplo
torna-se
Então você pode realmente querer fazer isso:
que substitui cada terminador de linha por um espaço. Desde o Java 8, você também pode fazer isso:
E se você deseja substituir vários separadores de linhas por um espaço:
fonte
Se você deseja remover apenas os terminadores de linha válidos no sistema operacional atual, faça o seguinte:
Se você deseja remover os separadores de linha, faça o seguinte:
Ou, um pouco mais detalhado, mas menos regular:
fonte
text.replaceAll("(\\r|\\n)+", " ")
(e assumindo que greedy é o padrão em Java?), Você terá uma solução com apenas um espaço para cada sequência de novos caracteres de linha.Essa função normaliza todo o espaço em branco, incluindo quebras de linha, em espaços únicos. Não é exatamente o que a pergunta original solicitou, mas provavelmente faz exatamente o que é necessário em muitos casos:
fonte
Isso seria eficiente, eu acho
fonte
Funcionou perfeitamente para mim depois de pesquisar muito, tendo falhado em todas as outras linhas.
fonte
Quebras de linha não são as mesmas em windows / linux / mac. Você deve usar System.getProperties com o atributo line.separator.
fonte
.replace retorna uma nova string, as strings em Java são imutáveis.
fonte
Você pode querer ler seu arquivo com um
BufferedReader
. Esta classe pode dividir a entrada em linhas individuais, que você pode montar à vontade. A maneira comoBufferedReader
opera reconhece automaticamente as convenções de final de linha dos mundos Linux, Windows e MacOS, independentemente da plataforma atual.Conseqüentemente:
Observe que
readLine()
não inclui o terminador de linha na string retornada. O código acima acrescenta um espaço para evitar colar a última palavra de uma linha e a primeira palavra da próxima linha.fonte
Mesmo que a definição de trim () no site da Oracle seja "Retorna uma cópia da string, com espaços em branco à esquerda e à direita omitidos".
a documentação omite que novos caracteres de linha (à esquerda e à direita) também serão removidos.
Em suma
String text = readFileAsString("textfile.txt").trim();
, também funcionará para você. (Verificado com Java 6)fonte
Acho estranho que o (Apache) StringUtils ainda não tenha sido abordado aqui.
você pode remover todas as novas linhas (ou quaisquer outras ocorrências de uma substring) de uma sequência usando o
.replace
métodoEsta linha substituirá todas as novas linhas pela sequência vazia.
como a nova linha é tecnicamente um caractere, você pode, opcionalmente, usar o
.replaceChars
método que substituirá os caracteresfonte
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Para sua informação, se você quiser substituir quebras de linha muti simultâneas por quebra de linha única, poderá usar
Ou substitua por um único espaço
fonte
Você pode usar IOUtils do apache commons para percorrer a linha e anexar cada linha ao StringBuilder. E não se esqueça de fechar o InputStream
fonte
Você pode usar métodos genéricos para substituir qualquer caractere por qualquer caractere.
fonte
org.apache.commons.lang.StringUtils # chopNewline
fonte
Tente fazer isso:
fonte
\n
não haverá\r\n
mais se você substituir \ n e houver um \\ n, ele será substituído, e somente o \ permanecerá.