Comment et pourquoi? Est-ce une expression régulière qui signifie n'importe quel caractère? Parce que dans mon esprit, avec la façon dont fonctionne la division, cela ne devrait être divisé que sur les caractères réels (,?,!, ^ Et). Cependant, cela fonctionne comme vous le dites.
Ty_
3
C'est en effet une expression régulière, appelée une anticipation négative. Consultez
Erwin
4
@ EW-CodeMonkey (?!... )est une syntaxe regex pour une assertion négative - elle affirme qu'il n'y a pas de correspondance avec ce qu'il contient . Et ^correspond au début de la chaîne, de sorte que l'expression régulière correspond à chaque position qui n'est pas le début de la chaîne, et y insère une division. Cette expression régulière correspond également à la fin de la chaîne et ajouterait donc une chaîne vide au résultat, sauf que la String.splitdocumentation dit que "les chaînes vides de fin ne sont pas incluses dans le tableau résultant".
Boann
8
En Java 8 le comportement String.splita été légèrement modifiée afin que leader des chaînes vides produites par un match nul largeur ne sont pas inclus aussi dans le tableau de résultat, de sorte que l' (?!^)affirmation selon laquelle la position n'est pas le début de la chaîne devient inutile, ce qui permet l'expression rationnelle être simplifié à rien - "cat".split("")- mais dans Java 7 et les versions antérieures, cela produit une chaîne vide de début dans le tableau de résultats.
C'était un changement horrible dans jdk8 parce que je me suis appuyé sur la division ("") et que j'ai fait des solutions de contournement à cause de ce premier index vide idiot. Maintenant, après la mise à niveau vers java8, cela fonctionne comme je l'aurais prévu il y a des années. malheureusement maintenant ma solution de contournement casse mon code ... ggrrrr.
Marc
@Marc Vous devriez probablement utiliser de .toCharArray()toute façon; il évite les regex et renvoie un tableau de charprimitives donc c'est plus rapide et plus léger. Il est étrange d'avoir besoin d'un tableau de chaînes à 1 caractère .
Nitpicking, la question d'origine demande un tableau de String, pas un tableau de Char. Cependant, il est assez facile d'obtenir un tableau de String à partir d'ici.
dsolimano
Ouais, je sais déjà comment obtenir un tableau de caractères. Je peux simplement parcourir le tableau char et créer une chaîne à partir de chacun, s'il n'y a pas d'autre moyen.
Matt
Comment voulez - vous convertir cArrayrevenir à String?
Bitmap
La syntaxe correcte serait: char [] cArray = str.ToCharArray ();
dbz
6
Si des caractères au-delà du plan multilingue de base sont attendus en entrée (certains caractères CJK, de nouveaux emoji ...), des approches telles que "a💫b".split("(?!^)")ne peuvent pas être utilisées, car elles cassent ces caractères (résultats en array ["a", "?", "?", "b"]) et quelque chose de plus sûr doit être utilisé:
Un moyen efficace de transformer une chaîne en un tableau de chaînes à un caractère serait de faire ceci:
String[] res =newString[str.length()];for(int i =0; i < str.length(); i++){
res[i]=Character.toString(str.charAt(i));}
Cependant, cela ne tient pas compte du fait que a chardans a Stringpourrait en fait représenter la moitié d'un point de code Unicode. (Si le point de code n'est pas dans le BMP.) Pour gérer cela, vous devez parcourir les points de code ... ce qui est plus compliqué.
Cette approche sera plus rapide que l'utilisation String.split(/* clever regex*/), et ce sera probablement plus rapide que l'utilisation des flux Java 8+. C'est probablement plus rapide que cela:
String[] res =newString[str.length()];int0=0;for(char ch: str.toCharArray[]){
res[i++]=Character.toString(ch);}
car toCharArraydoit copier les caractères dans un nouveau tableau.
Êtes-vous sûr que cela va diviser une chaîne en un tableau? Vous imprimez simplement la chaîne à l'écran.
TDG
0
Si la chaîne d'origine contient des caractères Unicode supplémentaires , split()cela ne fonctionnera pas, car elle divise ces caractères en paires de substitution. Pour gérer correctement ces caractères spéciaux, un code comme celui-ci fonctionne:
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("")
fera.Réponses:
Cela produira
la source
(?!
...)
est une syntaxe regex pour une assertion négative - elle affirme qu'il n'y a pas de correspondance avec ce qu'il contient . Et^
correspond au début de la chaîne, de sorte que l'expression régulière correspond à chaque position qui n'est pas le début de la chaîne, et y insère une division. Cette expression régulière correspond également à la fin de la chaîne et ajouterait donc une chaîne vide au résultat, sauf que laString.split
documentation dit que "les chaînes vides de fin ne sont pas incluses dans le tableau résultant".String.split
a été légèrement modifiée afin que leader des chaînes vides produites par un match nul largeur ne sont pas inclus aussi dans le tableau de résultat, de sorte que l'(?!^)
affirmation selon laquelle la position n'est pas le début de la chaîne devient inutile, ce qui permet l'expression rationnelle être simplifié à rien -"cat".split("")
- mais dans Java 7 et les versions antérieures, cela produit une chaîne vide de début dans le tableau de résultats.Mais si vous avez besoin de chaînes
Edit: qui renverra une première valeur vide.
la source
.toCharArray()
toute façon; il évite les regex et renvoie un tableau dechar
primitives donc c'est plus rapide et plus léger. Il est étrange d'avoir besoin d'un tableau de chaînes à 1 caractère .la source
cArray
revenir àString
?Si des caractères au-delà du plan multilingue de base sont attendus en entrée (certains caractères CJK, de nouveaux emoji ...), des approches telles que
"a💫b".split("(?!^)")
ne peuvent pas être utilisées, car elles cassent ces caractères (résultats enarray ["a", "?", "?", "b"]
) et quelque chose de plus sûr doit être utilisé:la source
Un moyen efficace de transformer une chaîne en un tableau de chaînes à un caractère serait de faire ceci:
Cependant, cela ne tient pas compte du fait que a
char
dans aString
pourrait en fait représenter la moitié d'un point de code Unicode. (Si le point de code n'est pas dans le BMP.) Pour gérer cela, vous devez parcourir les points de code ... ce qui est plus compliqué.Cette approche sera plus rapide que l'utilisation
String.split(/* clever regex*/)
, et ce sera probablement plus rapide que l'utilisation des flux Java 8+. C'est probablement plus rapide que cela:car
toCharArray
doit copier les caractères dans un nouveau tableau.la source
Pour résumer les autres réponses ...
Cela fonctionne sur toutes les versions de Java:
Cela ne fonctionne que sur Java 8 et plus:
la source
Vous pouvez peut-être utiliser une boucle for qui parcourt le contenu String et extraire les caractères par caractères à l'aide de la
charAt
méthode.Combiné avec un
ArrayList<String>
par exemple, vous pouvez obtenir votre tableau de caractères individuels.la source
la source
Si la chaîne d'origine contient des caractères Unicode supplémentaires ,
split()
cela ne fonctionnera pas, car elle divise ces caractères en paires de substitution. Pour gérer correctement ces caractères spéciaux, un code comme celui-ci fonctionne:la source
split("(?!^)")
ne fonctionne pas correctement si la chaîne contient des paires de substitution. Vous devriez utilisersplit("(?<=.)")
.production:
la source
L'opérateur de diffusion [
...
] crée un tableau avec chaque caractère de la chaîne:la source