Como e por quê? Este é um regex que significa qualquer caractere? Porque, em minha mente, da maneira como a divisão funciona, isso deve ser dividido apenas nos caracteres reais (,?,!, ^ E). No entanto, funciona como você diz.
Ty_
3
Esta é de fato uma expressão regex, chamada de lookahead negativo. Verifique
Erwin
4
@ EW-CodeMonkey (?!... )é a sintaxe regex para uma afirmação negativa - ela afirma que não há correspondência com o que está dentro dela. E ^corresponde ao início da string, de modo que a regex corresponde a todas as posições que não sejam o início da string e insere uma divisão ali. Este regex também corresponde ao final da string e, portanto, também acrescentaria uma string vazia ao resultado, exceto que a String.splitdocumentação diz "strings vazias não estão incluídas na matriz resultante".
Boann
8
Em Java 8 o comportamento de String.splitfoi ligeiramente alterado para que conduz cadeias vazias produzidos por um jogo de largura zero também não são incluídos na matriz resultado, de modo a (?!^)afirmação de que a posição não é o início da cadeia torna-se desnecessário, permitindo a expressão regular a ser simplificado para nada - "cat".split("")- mas no Java 7 e abaixo isso produz uma string vazia inicial na matriz de resultado.
Esta foi uma mudança horrível em jdk8 porque eu confiei em split ("") e fiz soluções alternativas para este primeiro índice vazio. Agora, depois de atualizar para o java8, ele funciona como eu esperava anos atrás. infelizmente agora minha solução alternativa quebra meu código ... ggrrrr.
Marc,
@Marc Você provavelmente deveria estar usando de .toCharArray()qualquer maneira; ele evita regex e retorna uma matriz de charprimitivas, então é mais rápido e leve. É estranho precisar de uma matriz de strings de 1 caractere .
Nitpicking, a pergunta original pede um array de String, não um array de Char. No entanto, é muito fácil obter um array de String daqui.
dsolimano
Sim, eu já sei como obter uma variedade de caracteres. Posso apenas iterar pelo array char e criar uma string de cada um, se não houver outra maneira.
Matt,
Como você converteria de cArrayvolta para String?
Bitmap de
A sintaxe correta seria: char [] cArray = str.ToCharArray ();
dbz
6
Se caracteres além do Plano Multilíngue Básico são esperados na entrada (alguns caracteres CJK, novo emoji ...), abordagens como "a💫b".split("(?!^)")não podem ser usadas, porque quebram esses caracteres (resultados em array ["a", "?", "?", "b"]) e algo mais seguro deve ser usado:
Uma maneira eficiente de transformar uma String em uma matriz de Strings de um caractere seria fazer o seguinte:
String[] res =newString[str.length()];for(int i =0; i < str.length(); i++){
res[i]=Character.toString(str.charAt(i));}
No entanto, isso não leva em consideração o fato de que um charem umString pode realmente representar metade de um ponto de código Unicode. (Se o ponto de código não estiver no BMP.) Para lidar com isso, você precisa iterar pelos pontos de código ... o que é mais complicado.
Essa abordagem será mais rápida do que usar String.split(/* clever regex*/)e provavelmente será mais rápida do que usar streams Java 8+. Provavelmente é mais rápido do que isso:
String[] res =newString[str.length()];int0=0;for(char ch: str.toCharArray[]){
res[i++]=Character.toString(ch);}
porque toCharArraytem que copiar os caracteres para uma nova matriz.
Tem certeza de que isso vai dividir uma string em um array? Você está apenas imprimindo a string na tela.
TDG de
0
Se a string original contiver caracteres Unicode suplementares , split()não funcionará, pois divide esses caracteres em pares substitutos. Para lidar corretamente com esses caracteres especiais, um código como este funciona:
String[] chars =newString[stringToSplit.codePointCount(0, stringToSplit.length())];for(int i =0, j =0; i < stringToSplit.length(); j++){int cp = stringToSplit.codePointAt(i);char c[]=Character.toChars(cp);
chars[j]=newString(c);
i +=Character.charCount(cp);}
.split("")
fará isso.Respostas:
Isso vai produzir
fonte
(?!
...)
é a sintaxe regex para uma afirmação negativa - ela afirma que não há correspondência com o que está dentro dela. E^
corresponde ao início da string, de modo que a regex corresponde a todas as posições que não sejam o início da string e insere uma divisão ali. Este regex também corresponde ao final da string e, portanto, também acrescentaria uma string vazia ao resultado, exceto que aString.split
documentação diz "strings vazias não estão incluídas na matriz resultante".String.split
foi ligeiramente alterado para que conduz cadeias vazias produzidos por um jogo de largura zero também não são incluídos na matriz resultado, de modo a(?!^)
afirmação de que a posição não é o início da cadeia torna-se desnecessário, permitindo a expressão regular a ser simplificado para nada -"cat".split("")
- mas no Java 7 e abaixo isso produz uma string vazia inicial na matriz de resultado.Mas se você precisa de cordas
Editar: que retornará um primeiro valor vazio.
fonte
.toCharArray()
qualquer maneira; ele evita regex e retorna uma matriz dechar
primitivas, então é mais rápido e leve. É estranho precisar de uma matriz de strings de 1 caractere .fonte
cArray
volta paraString
?Se caracteres além do Plano Multilíngue Básico são esperados na entrada (alguns caracteres CJK, novo emoji ...), abordagens como
"a💫b".split("(?!^)")
não podem ser usadas, porque quebram esses caracteres (resultados emarray ["a", "?", "?", "b"]
) e algo mais seguro deve ser usado:fonte
Uma maneira eficiente de transformar uma String em uma matriz de Strings de um caractere seria fazer o seguinte:
No entanto, isso não leva em consideração o fato de que um
char
em umString
pode realmente representar metade de um ponto de código Unicode. (Se o ponto de código não estiver no BMP.) Para lidar com isso, você precisa iterar pelos pontos de código ... o que é mais complicado.Essa abordagem será mais rápida do que usar
String.split(/* clever regex*/)
e provavelmente será mais rápida do que usar streams Java 8+. Provavelmente é mais rápido do que isso:porque
toCharArray
tem que copiar os caracteres para uma nova matriz.fonte
Para resumir as outras respostas ...
Isso funciona em todas as versões do Java:
Isso só funciona no Java 8 e superior:
fonte
Talvez você possa usar um loop for que atravessa o conteúdo da String e extrair caracteres por caracteres usando o
charAt
método.Combinado com um,
ArrayList<String>
por exemplo, você pode obter seu conjunto de caracteres individuais.fonte
fonte
Se a string original contiver caracteres Unicode suplementares ,
split()
não funcionará, pois divide esses caracteres em pares substitutos. Para lidar corretamente com esses caracteres especiais, um código como este funciona:fonte
split("(?!^)")
não funciona corretamente se a string contiver pares substitutos. Você deve usarsplit("(?<=.)")
.resultado:
fonte
O operador spread [
...
] cria uma matriz com cada caractere na string:fonte