4 votes

Obtenir la position dans la chaîne d'origine à partir de `StringTokenizer`

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.

8voto

Rohit Jain Points 90368

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.

1voto

micha Points 7756

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

0voto

juice Points 18

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X