Split Java String por New Line

Estoy tratando de dividir texto en un JTextArea usando una expresión regular para dividir el String por \n Sin embargo, esto no funciona y también lo intenté con \r\n|\r|n y 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"); } 

Esto debería cubrirlo:

 String lines[] = string.split("\\r?\\n"); 

Solo hay dos nuevas líneas (UNIX y Windows) de las que debe preocuparse.

Si no quieres líneas vacías:

 String.split("[\\r\\n]+") 

split método de split usa expresiones regulares (expresiones regulares). Como Java 8 regex admite \R que representa (de la documentación de la clase Pattern ):

Linecher matcher
\ R Cualquier secuencia de salto de línea Unicode, es equivalente a \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Entonces podemos usarlo para que coincida:

  • \u000D\000A -> \r\n par
  • \ u000A -> avance de línea ( \n )
  • \ u000b -> tabulación de línea (NO confunda con la tabulación de caracteres \t que es \u0009 )
  • \ u000C -> alimentación de formulario ( \f )
  • \ u000D -> retorno de carro ( \r )
  • \ u0085 -> siguiente línea (NEL)
  • \ u2028 -> separador de línea
  • \ u2029 -> separador de párrafo

Como ve, \r\n se coloca al inicio de la expresión regular, lo que garantiza que la expresión regular intentará hacer coincidir primero este par , y solo si falla intentará hacer coincidir los separadores de línea de caracteres individuales .


Por lo tanto, si desea dividir el separador de línea, use split("\\R") .

Si no desea eliminar de la matriz resultante las cadenas vacías que se arrastran "" utilice split(regex, limit) con un parámetro de limit negativo como split("\\R", -1) .

Si desea tratar una o más líneas continuas vacías como delimitador único use split("\\R+") .

 String.split(System.getProperty("line.separator")); 

Esto debería ser independiente del sistema

No es necesario duplicar los caracteres de escape en los grupos de caracteres.

Para todas las líneas no vacías use:

 String.split("[\r\n]+") 

Quizás esto funcione:

Elimine las barras diagonales inversas dobles del parámetro del método de división:

 split = docStr.split("\n"); 

Para preservar las líneas vacías de ser aplastado use:

 String lines[] = String.split("\\r?\\n", -1); 

Todas las respuestas dadas aquí en realidad no respetan la definición de Javas de nuevas líneas como se da, por ejemplo, en BufferedReader # readline. Java está aceptando \n , \r y \r\n como nueva línea. Algunas de las respuestas coinciden con múltiples líneas vacías o archivos mal formados. P.ej. \n\r\n al usar [\r\n]+ resultaría en dos líneas.

 String lines[] = string.split("(\r\n|\r|\n)", -1); 

Por el contrario, la respuesta anterior tiene las siguientes propiedades:

  • Cumple con la definición de Javas de una nueva línea como, por ejemplo, BufferedReader lo está usando
  • no coincide con múltiples líneas nuevas
  • no elimina las líneas vacías

El código anterior en realidad no hace nada visible, simplemente calcualtes luego vuelca el cálculo. ¿Es el código que usaste, o solo un ejemplo para esta pregunta?

intente hacer textAreaDoc.insertString (int, String, AttributeSet) al final?

Si, por algún motivo, no desea utilizar String.split (por ejemplo, debido a expresiones regulares ) y desea utilizar progtwigción funcional en Java 8 o posterior:

 List lines = new BufferedReader(new StringReader(string)) .lines() .collect(Collectors.toList()); 

String lines[] =String.split( System.lineSeparator())

Después de bashs fallidos sobre la base de todas las soluciones dadas. Reemplace \n con una palabra especial y luego me divido. Para mí, seguir el truco:

 article = "Alice phoned\n bob."; article = article.replace("\\n", " NEWLINE "); String sen [] = article.split(" NEWLINE "); 

No podría replicar el ejemplo dado en la pregunta. Pero, supongo que esta lógica se puede aplicar.

Como alternativa a las respuestas anteriores, la API de Splitter de guava 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:

 import com.google.common.base.Splitter; Iterable split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr); 

Tenga en cuenta que el resultado es un Iterable y no una matriz.

Se ha introducido una nueva lines método en String clase String en java-11 , que devuelve Stream

Devuelve una secuencia de subcadenas extraídas de esta cadena dividida por terminadores de línea.

Los terminadores de línea reconocidos son avance de línea “\ n” (U + 000A), retorno de carro “\ r” (U + 000D) y un retorno de carro seguido inmediatamente por un avance de línea “\ r \ n” (U + 000D U + 000A )

Aquí están algunos ejemplos:

 jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println) lorem ipusm sit jshell> "lorem \n ipusm \r sit".lines().forEach(System.out::println) lorem ipusm sit jshell> "lorem \n ipusm \r\n sit".lines().forEach(System.out::println) lorem ipusm sit 

String # lines ()

  • prueba esta esperanza que fue útil para ti

  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"); 

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:

Notepad ++

Lo más simple es normalizar el line feed y luego dividirlo.

 final String[] lines = contents.replace("\r\n", "\n") .replace("\r", "\n") .split("\n", -1); 
 package in.javadomain; public class JavaSplit { public static void main(String[] args) { String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot"; System.out.println("Before split:\n"); System.out.println(input); String[] inputSplitNewLine = input.split("\\n"); System.out.println("\n After split:\n"); for(int i=0; i