Je dois obtenir les jetons séparés par des espaces dans une chaîne, mais je dois également connaître la position du caractère dans la chaîne d'origine à laquelle chaque jeton commence. Existe-t-il un moyen de faire cela avec StringTokenizer
? De plus, à ce que je comprends, il s'agit d'une classe obsolète; y a-t-il une meilleure alternative à l'utilisation de StringTokenizer
.
Réponses
Trop de publicités?Vous devriez toujours utiliser String#split()
pour diviser votre chaîne plutôt que StringTokenizer
.
Cependant, si vous voulez également la position des jetons dans votre chaîne, alors il serait préférable d'utiliser la classe Pattern
et la classe Matcher
. Vous avez la méthode Matcher#start()
qui donne la position de la chaîne correspondant au motif.
Voici un exemple: -
String str = "abc asf basdfasf asf";
Matcher matcher = Pattern.compile("\\S+").matcher(str);
while (matcher.find()) {
System.out.println(matcher.start() + ":" + matcher.group());
}
Le motif \\S+
correspond aux caractères non-espace de cette chaîne. Utiliser la méthode Matcher#find()
retourne toutes les sous-chaînes correspondantes.
Vous pouvez facilement le faire vous-même en utilisant String.split()
String text = "hello world example";
int tokenStartIndex = 0;
for (String token : text.split(" ")) {
System.out.println("token: " + token + ", tokenStartIndex: " + tokenStartIndex);
tokenStartIndex += token.length() + 1; // +1 à cause de l'espace
}
cela affiche :
token: hello, tokenStartIndex: 0
token: world, tokenStartIndex: 6
token: example, tokenStartIndex: 12
J'ai amélioré la réponse de micha, afin qu'elle puisse gérer les espaces voisins :
String text = "hello world example";
int start = 0;
for (String token : text.split("[\u00A0 \n]")) {
if (token.length() > 0) {
start = text.indexOf(token, start);
System.out.println("token: " + token + ", start at: " + start);
}
}
La sortie est :
token: hello, start at: 0
token: world, start at: 7
token: example, start at: 17