¿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.
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 .
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:
Una forma eficiente de convertir una cadena en una matriz de cadenas de un carácter sería hacer esto:
String[] res =newString[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 =newString[str.length()];int0=0;for(char ch: str.toCharArray[]){
res[i++]=Character.toString(ch);}
porque toCharArraytiene que copiar los caracteres a una nueva matriz.
¿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 =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("")
lo hará.Respuestas:
Esto producirá
fuente
(?!
...)
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 laString.split
documentación dice "las cadenas vacías finales no se incluyen en la matriz resultante".String.split
se 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.Pero si necesitas cuerdas
Editar: que devolverá un primer valor vacío.
fuente
.toCharArray()
todos modos; evita las expresiones regulares y devuelve una serie dechar
primitivas para que sea más rápido y ligero. Es extraño necesitar una matriz de cadenas de 1 carácter .fuente
cArray
nuevoString
?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 enarray ["a", "?", "?", "b"]
) y se debe usar algo más seguro:fuente
Una forma eficiente de convertir una cadena en una matriz de cadenas de un carácter sería hacer esto:
Sin embargo, esto no tiene en cuenta el hecho de que a
char
en aString
podrí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:porque
toCharArray
tiene que copiar los caracteres a una nueva matriz.fuente
Para resumir las otras respuestas ...
Esto funciona en todas las versiones de Java:
Esto solo funciona en Java 8 y versiones posteriores:
fuente
Tal vez pueda usar un bucle for que recorra el contenido de String y extraiga caracteres por caracteres usando el
charAt
método.Combinado con,
ArrayList<String>
por ejemplo, puede obtener su matriz de caracteres individuales.fuente
fuente
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:fuente
split("(?!^)")
no funciona correctamente si la cadena contiene pares suplentes. Deberías usarsplit("(?<=.)")
.salida:
fuente
El operador de propagación [
...
] crea una matriz con cada carácter de la cadena:fuente