Dividir la cadena en una matriz de cadenas de caracteres


Respuestas:


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

Esto producirá

matriz ["c", "a", "t"]


8
¿Como y por qué? ¿Es esta una expresión regular que significa algún carácter? Porque en mi mente, con la forma en que funciona la división, esto debería dividirse solo en los caracteres reales (,?,!, ^ Y). Sin embargo, funciona como dices.
Ty_

3
De hecho, se trata de una expresión regular, llamada búsqueda anticipada negativa. Consulte
Erwin

4
@ EW-CodeMonkey (?!... )es una sintaxis de expresiones regulares para una aserción negativa: afirma que no hay coincidencia de lo que hay dentro. Y ^coincide con el comienzo de la cadena, por lo que la expresión regular coincide en cada posición que no es el comienzo de la cadena e inserta una división allí. Esta expresión regular también coincide al final de la cadena y, por lo tanto, también agregaría una cadena vacía al resultado, excepto que la String.splitdocumentación dice "las cadenas vacías finales no se incluyen en la matriz resultante".
Boann

8
En Java 8 el comportamiento de String.splitse cambió ligeramente de modo que lleva cadenas vacías producidas por un partido de anchura cero tampoco están incluidos en el campo de resultados, por lo que la (?!^)afirmación de que la posición no es el principio de la cadena se convierte en innecesaria, lo que permite la expresión regular a simplificarse a nada, "cat".split("")pero en Java 7 y versiones posteriores, eso produce una cadena vacía inicial en la matriz de resultados.
Boann

1
Crea una matriz de una cadena completa.
Eduard

109
"cat".toCharArray()

Pero si necesitas cuerdas

"cat".split("")

Editar: que devolverá un primer valor vacío.


12
"cat" .split ("") devolvería [, c, a, t], ¿no? Tendrás un personaje adicional en tu Array ...
reef

4
El "gato" .split ("") no funciona como esperaba Matt, obtendrá un String => [, c, a, t] vacío adicional.
arrecife

5
Esta respuesta ahora funciona si está utilizando Java 8. Consulte stackoverflow.com/a/22718904/1587046
Alexis C.

4
Este fue un cambio horrible en jdk8 porque confié en split ("") e hice soluciones a causa de este primer índice vacío tonto. Ahora, después de actualizar a java8, funciona como lo hubiera esperado hace años. desafortunadamente ahora mi solución rompe mi código ... ggrrrr.
Marc

@Marc Probablemente deberías usarlo de .toCharArray()todos modos; evita las expresiones regulares y devuelve una serie de charprimitivas para que sea más rápido y ligero. Es extraño necesitar una matriz de cadenas de 1 carácter .
Boann

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

3
Nitpicking, la pregunta original pide una matriz de String, no una matriz de Char. Sin embargo, es bastante fácil obtener una matriz de String desde aquí.
dsolimano

Sí, ya sé cómo obtener una variedad de caracteres. Sin embargo, puedo iterar a través de la matriz de caracteres y crear una cadena de cada uno, si no hay otra manera.
Matt

¿Cómo te convertirías de cArraynuevo String?
Mapa de bits

La sintaxis correcta sería: char [] cArray = str.ToCharArray ();
dbz

6

Si se esperan caracteres más allá del plano multilingüe básico en la entrada (algunos caracteres CJK, nuevos emoji ...), "a💫b".split("(?!^)")no se pueden usar enfoques como , porque dividen dichos caracteres (resultados en array ["a", "?", "?", "b"]) y se debe usar algo más seguro:

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

2

Una forma eficiente de convertir una cadena en una matriz de cadenas de un carácter sería hacer esto:

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

Sin embargo, esto no tiene en cuenta el hecho de que a charen a Stringpodría representar la mitad de un punto de código Unicode. (Si el punto de código no está en el BMP). Para lidiar con eso, necesita iterar a través de los puntos de código ... lo cual es más complicado.

Este enfoque será más rápido que usarlo String.split(/* clever regex*/), y probablemente será más rápido que usar flujos de Java 8+. Es probable que sea más rápido que esto:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

porque toCharArraytiene que copiar los caracteres a una nueva matriz.


2

Para resumir las otras respuestas ...

Esto funciona en todas las versiones de Java:

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

Esto solo funciona en Java 8 y versiones posteriores:

"cat".split("")

0

Tal vez pueda usar un bucle for que recorra el contenido de String y extraiga caracteres por caracteres usando el charAtmétodo.

Combinado con, ArrayList<String>por ejemplo, puede obtener su matriz de caracteres individuales.


Tal vez podrías pararte sobre una pierna y cantar "God Save the Queen". Lo siento, pero esto ni siquiera está cerca de ser correcto.
Stephen C

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

1
¿Estás seguro de que esto va a dividir una cadena en una matriz? Estás imprimiendo la cuerda en la pantalla.
TDG

0

Si la cadena original contiene caracteres Unicode suplementarios , entonces split()no funcionaría, ya que divide estos caracteres en pares sustitutos. Para manejar correctamente estos caracteres especiales, un 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("(?!^)")no funciona correctamente si la cadena contiene pares suplentes. Deberías usar split("(?<=.)").

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

salida:

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

0

El operador de propagación [ ...] crea una matriz con cada carácter de la cadena:

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

console.log(arrayized);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.