¿Cómo puedo reemplazar todos los saltos de línea de una cadena en Java de tal manera que funcione en Windows y Linux (es decir, sin problemas específicos del sistema operativo de retorno de carro / avance de línea / nueva línea, etc.)?
Lo he intentado (nota readFileAsString es una función que lee un archivo de texto en una Cadena):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
Pero esto no parece funcionar.
¿Cómo se puede hacer esto?
java
string
newline
line-breaks
hacker
fuente
fuente
myString.trim().replaceAll("[\n]{2,}", "\n")
O reemplazar con un solo espaciomyString.trim().replaceAll("[\n]{2,}", " ")
Respuestas:
Debe establecer
text
los resultados detext.replace()
:Esto es necesario porque las cadenas son inmutables: las llamadas
replace
no cambian la cadena original, devuelve una nueva que se ha cambiado. Si no asigna el resultadotext
, entonces esa nueva Cadena se pierde y se recolecta basura.En cuanto a obtener la cadena de nueva línea para cualquier entorno, que está disponible llamando
System.getProperty("line.separator")
.fuente
replace()
método devuelve el resultado deseado. También vea los documentos de la API: java.sun.com/javase/6/docs/api/java/lang/… Editar: ah ya lo editó usted mismo después :)text = text.replace("\r\n", " ").replace("\n", " ");
sea una mejor solución: de lo contrario, las palabras se "pegarán" entre sí (sin el reemplazo de un solo espacio)..replaceAll("[\\r\\n]+", "")
text = text.replaceAll("\n", "").replaceAll("\r", "");
replaceAll
toma expresiones regulares,replace
toma cadenas literales, ambas reemplazan todas las ocurrencias.Como se señaló en otras respuestas, su código no funciona principalmente porque
String.replace(...)
no cambia el objetivoString
. (No puede, ¡las cadenas de Java son inmutables!) Lo quereplace
realmente hace es crear y devolver un nuevoString
objeto con los caracteres cambiados según sea necesario. Pero tu código arroja esoString
...Aquí hay algunas posibles soluciones. Cuál es el más correcto depende de qué es exactamente lo que está tratando de hacer.
Simplemente elimina todos los caracteres de nueva línea. Esto no hace frente a las terminaciones de línea de Windows o Mac.
Elimina todos los terminadores de línea para la plataforma actual. Esto no hace frente al caso en el que intenta procesar (por ejemplo) un archivo UNIX en Windows, o viceversa.
Elimina todos los terminadores de línea de Windows, UNIX o Mac. Sin embargo, si el archivo de entrada es texto, esto concatenará palabras; p.ej
se convierte
Por lo tanto, es posible que desee hacer esto:
que reemplaza cada terminador de línea con un espacio. Desde Java 8 también puedes hacer esto:
Y si desea reemplazar varios separadores de línea con un espacio:
fuente
Si desea eliminar solo los terminadores de línea que son válidos en el sistema operativo actual, puede hacer esto:
Si desea asegurarse de eliminar los separadores de línea, puede hacerlo así:
O, un poco más detallado, pero menos regexy:
fuente
text.replaceAll("(\\r|\\n)+", " ")
y (¿suponiendo que codicioso es el predeterminado en Java?) Tendrá una solución con solo un espacio para cada secuencia de nuevos caracteres de línea.Esta función normaliza todos los espacios en blanco, incluidos los saltos de línea, a espacios individuales. No es exactamente lo que pidió la pregunta original, pero es probable que haga exactamente lo que se necesita en muchos casos:
fuente
Supongo que esto sería eficiente
fuente
Funcionó perfectamente para mí después de buscar mucho, habiendo fallado con cada otra línea.
fuente
Los saltos de línea no son iguales en windows / linux / mac. Debe usar System.getProperties con el atributo line.separator.
fuente
.replace devuelve una nueva cadena, las cadenas en Java son inmutables.
fuente
Es posible que desee leer su archivo con un
BufferedReader
. Esta clase puede dividir la entrada en líneas individuales, que puede ensamblar a voluntad. La maneraBufferedReader
funciona reconoce las convenciones de final de línea de los mundos de Linux, Windows y MacOS automáticamente, independientemente de la plataforma actual.Por lo tanto:
Tenga en cuenta que
readLine()
no incluye el terminador de línea en la cadena devuelta. El código anterior agrega un espacio para evitar pegar la última palabra de una línea y la primera palabra de la línea siguiente.fuente
Aunque la definición de trim () en el sitio web de Oracle es "Devuelve una copia de la cadena, con espacios en blanco iniciales y finales omitidos".
la documentación omite decir que los nuevos caracteres de línea (al principio y al final) también se eliminarán.
En resumen
String text = readFileAsString("textfile.txt").trim();
, también funcionará para usted. (Comprobado con Java 6)fuente
Me resulta extraño que (Apache) StringUtils no esté cubierto aquí todavía.
puede eliminar todas las líneas nuevas (o cualquier otra ocurrencia de una subcadena para ese asunto) de una cadena usando el
.replace
métodoEsta línea reemplazará todas las líneas nuevas con la cadena vacía.
como newline es técnicamente un carácter, opcionalmente puede usar el
.replaceChars
método que reemplazará a los caracteresfuente
StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Para su información, si desea reemplazar los saltos de línea simultáneos simultáneos con un solo salto de línea, puede usar
O reemplazar con un solo espacio
fuente
Puede usar apache commons IOUtils para recorrer en iteración la línea y agregar cada línea a StringBuilder. Y no olvides cerrar InputStream
fuente
Puede usar métodos genéricos para reemplazar cualquier carácter con cualquier carácter.
fuente
org.apache.commons.lang.StringUtils # chopNewline
fuente
Intenta hacer esto:
fuente
\n
ya no existe\r\n
si reemplaza \ n y hay un \\ n, se reemplazará, por lo que solo quedará el \.