Estoy tratando de dividir el texto JTextArea
usando una expresión regular para dividir la cadena por \n
Sin embargo, esto no funciona y también probé con \r\n|\r|n
muchas otras combinaciones de expresiones regulares. Código:
public void insertUpdate(DocumentEvent e) {
String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();
try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
split = docStr.split("\\n");
}
Respuestas:
Esto debería cubrirlo:
Solo hay dos líneas nuevas (UNIX y Windows) de las que debe preocuparse.
fuente
split
por defecto elimina las cadenas vacías finales si son resultado de una división. Para desactivar este mecanismo, debe utilizar una versión sobrecargadasplit(regex, limit)
con límite negativo comotext.split("\\r?\\n", -1)
. Más información: Java String split eliminó valores vacíosString#split(String regex)
El método está utilizando expresiones regulares (expresiones regulares). Como Java 8 regex es compatible con lo\R
que representa (de la documentación de la clase Pattern ):Entonces podemos usarlo para que coincida con:
\u000D\000A
->\r\n
par\n
)\t
que es\u0009
)\f
)\r
)Como puede ver,
\r\n
se coloca al comienzo de la expresión regular, lo que garantiza que la expresión regular intentará hacer coincidir este par primero, y solo si esa coincidencia falla, intentará hacer coincidir los separadores de línea de un solo carácter .Entonces, si desea dividir el uso del separador de línea
split("\\R")
.Si no desea eliminar de la matriz resultante las cadenas vacías finales,
""
use parámetrossplit(regex, limit)
negativoslimit
comosplit("\\R", -1)
.Si desea tratar una o más líneas continuas vacías como uso delimitador único
split("\\R+")
.fuente
\\R+
para evitar cualquier personaje de final de línea que no estuviera cubierto\\R
solo.Si no quieres líneas vacías:
fuente
Esto debería ser independiente del sistema
fuente
Se
lines
ha introducido un nuevo método para laString
clase enjava-11, que devuelveStream<String>
Aquí están algunos ejemplos:
Cadena # líneas ()
fuente
No tiene que duplicar los caracteres de escape en los grupos de personajes.
Para todas las líneas no vacías use:
fuente
\r
y\n
puede tener una o dos barras invertidas; funcionan de cualquier manera.'\\'
en el código se convierte en un'\'
carácter y luego se pasa al motor RegEx, por lo que el"[\\r\\n]"
código se convierte[\r\n]
en memoria y RegEx procesará eso. No sé exactamente cómo Java maneja RegEx, pero es una buena práctica pasar un patrón de cadena ASCII "puro" al motor RegEx y dejar que procese en lugar de pasar caracteres binarios."[\r\n]"
se convierte en (hexadecimal)0D0A
en la memoria y un motor RegEx podría aceptarlo mientras que otro se ahogará. La conclusión es que, incluso si el sabor de RegEx de Java no los necesita, mantenga dos barras diagonales para compatibilidadEn
JDK11
laString
clase tiene unlines()
método:Además, la documentación continúa diciendo:
Con esto uno simplemente puede hacer:
entonces si quieres una matriz:
Dado que este método devuelve un Stream, ofrece muchas opciones para usted, ya que le permite a uno escribir expresiones concisas y declarativas de operaciones posiblemente paralelas.
fuente
Quizás esto funcionaría:
Elimine las barras invertidas dobles del parámetro del método de división:
fuente
Todas las respuestas dadas aquí en realidad no respetan la definición de Javas de nuevas líneas como se da en, por ejemplo, BufferedReader # readline. Java está aceptando
\n
,\r
y\r\n
como nueva línea. Algunas de las respuestas coinciden con varias líneas vacías o archivos con formato incorrecto. P.ej.<sometext>\n\r\n<someothertext>
cuando se usa[\r\n]+
daría como resultado dos líneas.Por el contrario, la respuesta anterior tiene las siguientes propiedades:
fuente
Si, por alguna razón, no desea utilizar
String.split
(por ejemplo, debido a expresiones regulares ) y desea utilizar la programación funcional en Java 8 o posterior:fuente
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
para una matriz en lugar de una lista. Lo bueno de esta solución es queBufferedReader
conoce todo tipo de terminadores similares, por lo que puede manejar texto en todo tipo de formatos. (La mayoría de las soluciones basadas en expresiones regulares publicadas aquí se quedan cortas en este sentido.)Para evitar que las líneas vacías se aplasten, use:
fuente
El código anterior en realidad no hace nada visible: simplemente se calcula y luego volca el cálculo. ¿Es el código que usó o solo un ejemplo para esta pregunta?
intente hacer textAreaDoc.insertString (int, String, AttributeSet) al final?
fuente
Como alternativa a las respuestas anteriores, la
Splitter
API de guayaba se puede usar si se van a aplicar otras operaciones a las líneas resultantes, como recortar líneas o filtrar líneas vacías:Tenga en cuenta que el resultado es una
Iterable
y no una matriz.fuente
String lines[] =String.split( System.lineSeparator())
fuente
Después de intentos fallidos sobre la base de todas las soluciones dadas. Reemplazo
\n
con una palabra especial y luego me separo. Para mí siguiente hizo el truco:No pude replicar el ejemplo dado en la pregunta. Pero, supongo que esta lógica se puede aplicar.
fuente
Las respuestas anteriores no me ayudaron en Android, gracias a la respuesta de Pshemo que funcionó para mí en Android. Dejaré algunas de las respuestas de Pshemo aquí:
fuente
fuente
Hay tres convenciones diferentes (se podría decir que son estándares de facto ) para establecer y mostrar un salto de línea:
carriage return
+line feed
line feed
carriage return
En algunos editores de texto, es posible intercambiar uno por el otro:
Lo más simple es normalizar
line feed
y luego dividir.fuente
Hay un chico nuevo en la ciudad, por lo que no debes lidiar con todas las complejidades anteriores. A partir de JDK 11 en adelante , solo necesita escribir como una sola línea de código, dividirá las líneas y le devolverá Stream of String.
Algunas referencias https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -características-y-apis-en-jdk-11 /
Espero que esto sea útil para alguien. Feliz codificación
fuente
fuente