J'ai besoin de diviser ma chaîne par des espaces. Pour cela, j'ai essayé:
str = "Hello I'm your String";
String[] splited = str.split(" ");
Mais cela ne semble pas fonctionner.
fork
lien dans le coin supérieur gauche.
J'ai besoin de diviser ma chaîne par des espaces. Pour cela, j'ai essayé:
str = "Hello I'm your String";
String[] splited = str.split(" ");
Mais cela ne semble pas fonctionner.
fork
lien dans le coin supérieur gauche.
Réponses:
Ce que vous avez devrait fonctionner. Si, cependant, les espaces fournis sont par défaut à ... autre chose? Vous pouvez utiliser l'expression rationnelle des espaces blancs:
str = "Hello I'm your String";
String[] splited = str.split("\\s+");
Cela entraînera un nombre illimité d'espaces consécutifs pour diviser votre chaîne en jetons.
En passant, je ne suis pas sûr que «divisé» soit un mot :) Je crois que l'état d'être victime d'une scission est également «scindé». C'est une de ces choses grammaticales délicates :-) N'essayant pas d'être pointilleux, je me suis dit que je le transmettrais!
Bien que la réponse acceptée soit bonne, sachez que vous vous retrouverez avec une chaîne vide de début si votre chaîne d'entrée commence par un espace blanc. Par exemple, avec:
String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");
Le résultat sera:
splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";
Donc, vous voudrez peut-être couper votre chaîne avant de la diviser:
String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");
[Éditer]
En plus de la trim
mise en garde, vous voudrez peut-être considérer le caractère d'espace insécable unicode ( U+00A0
). Ce caractère s'imprime comme un espace régulier dans une chaîne et se cache souvent dans du texte copié-collé à partir d'éditeurs de texte enrichi ou de pages Web. Ils ne sont pas gérés par .trim()
quels tests les caractères doivent être supprimés en utilisant c <= ' '
; \s
ne les attrapera pas non plus.
Au lieu de cela, vous pouvez utiliser \p{Blank}
mais vous devez également activer la prise en charge des caractères Unicode, ce que le normal split
ne fera pas. Par exemple, cela fonctionnera: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words)
mais cela ne fera pas la trim
partie.
Ce qui suit illustre le problème et fournit une solution. Il est loin d'être optimal de s'appuyer sur l'expression régulière pour cela, mais maintenant que Java a une représentation d'octets 8 bits / 16 bits, une solution efficace pour cela devient assez longue.
public class SplitStringTest
{
static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}$", UNICODE_CHARACTER_CLASS);
static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS);
public static String[] trimSplitUnicodeBySpace(String str)
{
Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
boolean ignore = trimMatcher.matches(); // always true but must be called since it does the actual matching/grouping
return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
}
@Test
void test()
{
String words = " Hello I'm\u00A0your String\u00A0";
// non-breaking space here --^ and there -----^
String[] split = words.split(" ");
String[] trimAndSplit = words.trim().split(" ");
String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);
System.out.println("words: [" + words + "]");
System.out.println("split: [" + Arrays.stream(split).collect(Collectors.joining("][")) + "]");
System.out.println("trimAndSplit: [" + Arrays.stream(trimAndSplit).collect(Collectors.joining("][")) + "]");
System.out.println("splitUnicode: [" + Arrays.stream(splitUnicode).collect(Collectors.joining("][")) + "]");
System.out.println("trimAndSplitUnicode: [" + Arrays.stream(trimAndSplitUnicode).collect(Collectors.joining("][")) + "]");
}
}
Résulte en:
words: [ Hello I'm your String ]
split: [][Hello][I'm your][String ]
trimAndSplit: [Hello][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]
Utilisez Stringutils.split()
pour diviser la chaîne par des blancs. Par exempleStringUtils.split("Hello World")
renvoie "Bonjour" et "Monde";
Afin de résoudre le cas mentionné, nous utilisons une méthode de partage comme celle-ci
String split[]= StringUtils.split("Hello I'm your String");
lorsque nous imprimons le tableau divisé, la sortie sera:
Bonjour
je suis
votre
Chaîne
Essayer
String[] splited = str.split("\\s");
http://download.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
si vous ne voulez pas utiliser la méthode de partage de chaîne, vous pouvez utiliser la classe StringTokenizer en Java comme ..
StringTokenizer tokens = new StringTokenizer("Hello I'm your String", " ");
String[] splited = new String[tokens.countTokens()];
int index = 0;
while(tokens.hasMoreTokens()){
splited[index] = tokens.nextToken();
++index;
}
Essaye celui-là
String str = "This is String";
String[] splited = str.split("\\s+");
String split_one=splited[0];
String split_second=splited[1];
String split_three=splited[2];
Log.d("Splited String ", "Splited String" + split_one+split_second+split_three);
OK, nous devons donc faire le fractionnement car vous avez déjà obtenu la réponse, je la généraliserais.
Si vous souhaitez diviser une chaîne par des espaces, délimitez (caractères spéciaux).
Tout d'abord, supprimez l'espace de tête car ils créent la plupart des problèmes.
str1 = " Hello I'm your String ";
str2 = " Are you serious about this question_ boy, aren't you? ";
Retirez d'abord l'espace de tête qui peut être de l'espace, des tabulations, etc.
String s = str1.replaceAll("^\\s+","");//starting with whitespace one or more
Maintenant, si vous voulez diviser par espace ou par n'importe quel caractère spécial.
String[] sa = s.split("[^\\w]+");//split by any non word char
Mais comme w contient [a-zA-Z_0-9], donc si vous voulez diviser par un trait de soulignement (_), utilisez également
String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space
replaceAll("^\\s+","")
m'a sauvé la journée. Cela a fonctionné pour mon cas. Merci
Exemple très simple ci-dessous:
J'espère que ça aide.
String str = "Hello I'm your String";
String[] splited = str.split(" ");
var splited = str.split(" ");
var splited1=splited[0]; //Hello
var splited2=splited[1]; //I'm
var splited3=splited[2]; //your
var splited4=splited[3]; //String
vous pouvez réduire la chaîne en utilisant le code ci-dessous
String thisString="Hello world";
String[] parts = theString.split(" ");
String first = parts[0];//"hello"
String second = parts[1];//"World"
Comme cela fait un moment que ces réponses n'ont pas été publiées, voici une autre façon plus actuelle de faire ce qui est demandé:
List<String> output = new ArrayList<>();
try (Scanner sc = new Scanner(inputString)) {
while (sc.hasNext()) output.add(sc.next());
}
Vous avez maintenant une liste de chaînes (ce qui est sans doute meilleur qu'un tableau); si vous avez besoin d'un tableau, vous pouvez le faireoutput.toArray(new String[0]);
Chaîne simple à cracher par espace
String CurrentString = "First Second Last";
String[] separated = CurrentString.split(" ");
for (int i = 0; i < separated.length; i++) {
if (i == 0) {
Log.d("FName ** ", "" + separated[0].trim() + "\n ");
} else if (i == 1) {
Log.d("MName ** ", "" + separated[1].trim() + "\n ");
} else if (i == 2) {
Log.d("LName ** ", "" + separated[2].trim());
}
}