Divida a string em uma série de strings de caracteres


Respostas:


120
"cat".split("(?!^)")

Isso vai produzir

array ["c", "a", "t"]


8
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.
Boann

1
Ele cria um array de uma string inteira.
Eduard

109
"cat".toCharArray()

Mas se você precisa de cordas

"cat".split("")

Editar: que retornará um primeiro valor vazio.


12
"cat" .split ("") retornaria [, c, a, t], não? Você terá um personagem extra em seu Array ...
recife

4
O "cat" .split ("") não funciona como esperado por Matt, você receberá uma String vazia extra => [, c, a, t].
recife de

5
Esta resposta agora funciona se você estiver usando Java 8. Consulte stackoverflow.com/a/22718904/1587046
Alexis C.

4
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 .
Boann

41
String str = "cat";
char[] cArray = str.toCharArray();

3
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:

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

Uma maneira eficiente de transformar uma String em uma matriz de Strings de um caractere seria fazer o seguinte:

String[] res = new String[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 = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

porque toCharArraytem que copiar os caracteres para uma nova matriz.


2

Para resumir as outras respostas ...

Isso funciona em todas as versões do Java:

"cat".split("(?!^)")

Isso só funciona no Java 8 e superior:

"cat".split("")

0

Talvez você possa usar um loop for que atravessa o conteúdo da String e extrair caracteres por caracteres usando o charAtmétodo.

Combinado com um, ArrayList<String>por exemplo, você pode obter seu conjunto de caracteres individuais.


Talvez você pudesse ficar em uma perna e cantar "God Save the Queen". Desculpe, mas isso não está nem perto de ser correto.
Stephen C

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
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 = new String[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] = new String(c);
    i += Character.charCount(cp);
}

0

split("(?!^)")não funciona corretamente se a string contiver pares substitutos. Você deve usar split("(?<=.)").

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

resultado:

[花, a, b, 🌹, 🌺, 🌷]

0

O operador spread [ ...] cria uma matriz com cada caractere na string:

const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];

console.log(arrayized);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.