Cadeia Java dividida por nova linha

Eu estou tentando dividir o texto em um JTextArea usando um regex para dividir o String por \n No entanto, isso não funciona e eu também tentei por \r\n|\r|n e muitas outras combinações de regexes. 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"); } 

Isso deve cobrir você:

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

Existem apenas duas novas linhas (UNIX e Windows) com as quais você precisa se preocupar.

Se você não quer linhas vazias:

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

split método split está usando o regex (expressões regulares). Como o Java 8 regex suporta \R que representa (da documentação da class Pattern ):

Matcher de linebreak
\ R Qualquer sequência de \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] linha Unicode é equivalente a \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Então podemos usá-lo para combinar:

  • \u000D\000A -> \r\n par
  • \ u000A -> feed de linha ( \n )
  • \ u000B -> tabulação de linha (NÃO confunda com tabulação de caracteres \t que é \u0009 )
  • \ u000C -> feed de formulário ( \f )
  • \ u000D -> retorno de carro ( \r )
  • \ u0085 -> próxima linha (NEL)
  • \ u2028 -> separador de linha
  • \ u2029 -> separador de parágrafo

Como você pode ver, \r\n é colocado no início da regex, o que garante que o regex tentará corresponder primeiro este par , e somente se ele falhar, tentará combinar os separadores de linha de caractere único .


Então, se você quiser dividir o separador de linha use split("\\R") .

Se você não deseja remover da matriz resultante, seqüências vazias "" use split(regex, limit) com parâmetro de limit negativo limit como split("\\R", -1) .

Se você quiser tratar uma ou mais linhas vazias contínuas como um único delimitador, use split("\\R+") .

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

Isso deve ser independente do sistema

Você não precisa dobrar caracteres de escape em grupos de caracteres.

Para todas as linhas não vazias, use:

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

Talvez isso funcionasse:

Remova as barras duplas invertidas do parâmetro do método split:

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

Para preservar linhas vazias de serem esmagadas, use:

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

Todas as respostas dadas aqui, na verdade, não respeitam a definição de novas linhas por Javas, como por exemplo, BufferedReader # readline. Java está aceitando \n , \r e \r\n como nova linha. Algumas das respostas correspondem a várias linhas vazias ou arquivos malformados. Por exemplo. \n\r\n quando usar [\r\n]+ resultaria em duas linhas.

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

Em contraste, a resposta acima tem as seguintes propriedades:

  • ele está em conformidade com a definição de uma nova linha do Javas, como por exemplo, o BufferedReader está usando-o
  • não combina várias novas linhas
  • não remove linhas vazias à direita

O código acima na verdade não faz nada visível – ele apenas calcula o cálculo. É o código que você usou ou apenas um exemplo para essa pergunta?

tente fazer textAreaDoc.insertString (int, String, AttributeSet) no final?

Se, por algum motivo, você não quiser usar o String.split (por exemplo, devido a expressões regulares ) e quiser usar a functional programming no Java 8 ou mais recente:

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

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

Após tentativas fracassadas com base em todas as soluções dadas. Eu substituo \n com alguma palavra especial e então divido. Para mim seguir o truque:

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

Eu não consegui replicar o exemplo dado na pergunta. Mas, eu acho que essa lógica pode ser aplicada.

Como alternativa às respostas anteriores, a API Splitter da goiaba pode ser usada se outras operações forem aplicadas às linhas resultantes, como aparar linhas ou filtrar linhas vazias:

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

Note que o resultado é um Iterable e não um array.

Um novo método de lines foi introduzido na class String em java-11 , que retorna o Stream

Retorna um stream de substrings extraídos dessa string particionada por terminadores de linha.

Os terminadores de linha reconhecidos são feed de linha “\ n” (U + 000A), retorno de carro “\ r” (U + 000D) e um retorno de carro seguido imediatamente por um avanço de linha “\ r \ n” (U + 000D U + 000A ).

Aqui estão alguns exemplos:

 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 # linhas ()

  • tente esta esperança foi útil para você

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

Existem três convenções diferentes (pode-se dizer que são padrões de fato ) para definir e exibir uma quebra de linha:

  • carriage return + line feed
  • line feed
  • carriage return

Em alguns editores de texto, é possível trocar um pelo outro:

Notepad ++

O mais simples é normalizar o line feed e depois dividir.

 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