Estou tentando dividir o texto em um JTextArea
usando uma regex para dividir a String por \n
No entanto, isso não funciona e 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");
}
Respostas:
Isso deve cobrir você:
Existem apenas duas novas linhas (UNIX e Windows) com as quais você precisa se preocupar.
fonte
split
por padrão remove as seqüências de caracteres vazias à direita se elas resultarem em divisão. Para desativar esse mecanismo, você precisa usar a versão sobrecarregada dosplit(regex, limit)
com limite negativo comotext.split("\\r?\\n", -1)
. Mais informações: Java Separa strings removido valores vaziosString#split(String regex)
O método está usando regex (expressões regulares). Como o Java 8 regex suporta o\R
que representa (da documentação da classe Pattern ):Para que possamos usá-lo para combinar:
\u000D\000A
->\r\n
par\n
)\t
que é\u0009
)\f
)\r
)Como você vê,
\r\n
é colocado no início do regex, o que garante que o regex tentará corresponder esse par primeiro e, somente se essa correspondência falhar, ele tentará corresponder aos separadores de linha de caracteres únicos .Portanto, se você deseja dividir no separador de linha, use
split("\\R")
.Se você não deseja remover da matriz resultante, as seqüências de caracteres vazias são
""
usadassplit(regex, limit)
comlimit
parâmetros negativos comosplit("\\R", -1)
.Se você deseja tratar uma ou mais linhas vazias contínuas como uso de delimitador único
split("\\R+")
.fonte
\\R+
, para evitar qualquer caractere de final de linha que não fosse coberto\\R
sozinho.Se você não quiser linhas vazias:
fonte
Isso deve ser independente do sistema
fonte
Um novo método
lines
foi introduzido naString
classe emjava-11, que retornaStream<String>
Aqui estão alguns exemplos:
String # lines ()
fonte
Você não precisa dobrar caracteres de escape em grupos de caracteres.
Para todas as linhas não vazias, use:
fonte
\r
e\n
pode ter uma ou duas barras invertidas; eles funcionam de qualquer maneira.'\\'
no código se torna um'\'
caractere e depois é passada para o mecanismo RegEx, portanto, o"[\\r\\n]"
código fica[\r\n]
na memória e o RegEx processará isso. Não sei exatamente como o Java lida com o RegEx, mas é uma boa prática passar um padrão de seqüência de caracteres ASCII "puro" para o mecanismo RegEx e deixá-lo processar em vez de passar caracteres binários."[\r\n]"
fica (hex)0D0A
na memória e um mecanismo RegEx pode aceitá-lo enquanto outro engasga. Assim a linha inferior é que, mesmo se o sabor de RegEx de Java não precisa delas, mantenha barras duplas para compatibilidadeJDK11
NaString
classe tem umlines()
método:Além disso, a documentação continua dizendo:
Com isso, pode-se simplesmente fazer:
então se você deseja uma matriz:
Dado que esse método retorna um Stream, ele oferece muitas opções, pois permite escrever expressões concisas e declarativas de operações possivelmente paralelas.
fonte
Talvez isso funcione:
Remova as barras invertidas duplas do parâmetro do método de divisão:
fonte
Todas as respostas fornecidas aqui, na verdade, não respeitam a definição de novas linhas do Javas, como em, 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.<sometext>\n\r\n<someothertext>
o uso[\r\n]+
resultaria em duas linhas.Por outro lado, a resposta acima tem as seguintes propriedades:
fonte
Se, por algum motivo, você não desejar usar
String.split
(por exemplo, devido a expressões regulares ) e desejar usar a programação funcional no Java 8 ou mais recente:fonte
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
para uma matriz em vez de uma lista. O legal dessa solução é que vocêBufferedReader
conhece todos os tipos de terminadores semelhantes, para que ele possa manipular texto em todos os tipos de formatos. (A maioria das soluções baseadas em regex postado aqui ficam aquém neste aspecto.)Para evitar que linhas vazias sejam esmagadas, use:
fonte
O código acima não faz nada visível - apenas calcula e depois despeja o cálculo. É o código que você usou ou apenas um exemplo para esta pergunta?
tente fazer textAreaDoc.insertString (int, String, AttributeSet) no final?
fonte
Como alternativa às respostas anteriores, a
Splitter
API da goiaba pode ser usada se outras operações forem aplicadas às linhas resultantes, como aparar linhas ou filtrar linhas vazias:Observe que o resultado é um
Iterable
e não um array.fonte
String lines[] =String.split( System.lineSeparator())
fonte
Após tentativas fracassadas com base em todas as soluções fornecidas. Eu substituo
\n
por alguma palavra especial e depois divido. Para mim, segui o truque:Não pude replicar o exemplo dado na pergunta. Mas acho que essa lógica pode ser aplicada.
fonte
As respostas acima não me ajudaram no Android, graças à resposta Pshemo que funcionou para mim no Android. Vou deixar aqui algumas das respostas de Pshemo :
fonte
fonte
Existem três convenções diferentes (pode-se dizer que esses 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:
A coisa mais simples é normalizar
line feed
e depois dividir.fonte
Há um garoto novo na cidade, então você não precisa lidar com todas as complexidades acima. A partir do JDK 11 , basta escrever como uma única linha de código, ele dividirá as linhas e retornará o Stream of String.
Algumas referências. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -features-and-apis-in-jdk-11 /
Espero que isso seja útil para alguém. Feliz codificação.
fonte
fonte