Estoy tratando de dividir el texto JTextAreausando una expresión regular para dividir la cadena por \nSin embargo, esto no funciona y también probé con \r\n|\r|nmuchas 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
splitpor 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\Rque representa (de la documentación de la clase Pattern ):Entonces podemos usarlo para que coincida con:
\u000D\000A->\r\npar\n)\tque es\u0009)\f)\r)Como puede ver,
\r\nse 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)negativoslimitcomosplit("\\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\\Rsolo.Si no quieres líneas vacías:
fuente
Esto debería ser independiente del sistema
fuente
Se
linesha introducido un nuevo método para laStringclase 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
\ry\npuede 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)0D0Aen 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
JDK11laStringclase 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,\ry\r\ncomo 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 queBufferedReaderconoce 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
SplitterAPI 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
Iterabley 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
\ncon 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 feedline feedcarriage returnEn algunos editores de texto, es posible intercambiar uno por el otro:
Lo más simple es normalizar
line feedy 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