2012-11-30 1 views
2

J'essaye de casser la chaîne sur delim "//". Ma chaîne contient aussi "/" et StringTokenizer donne un résultat étrange, il casse aussi une chaîne sur "/".StringTokenizer ne fonctionne pas correctement avec delim "//"

String mStr = "abcd//aaa//32434//3/34343"; 
     StringTokenizer tok = new StringTokenizer(mStr, "//"); 
     while(tok.hasMoreTokens()){ 
      System.out.println(tok.nextToken()); 
     } 

le résultat est

abcd 
aaa 
32434 
3 
34343 

Et le résultat attendu est

abcd 
    aaa 
    32434 
    3/34343 

Pourquoi cela se produit et quelle est la solution de celui-ci? Je ne veux pas remplacer "/" par d'autres caractères.

+0

Quel est le résultat attendu? –

+0

J'ai mis à jour le résultat attendu en question @NikolayKuznetsov – Talha

Répondre

8

StringTokenizer prend les deux jetons comme séparés, et les deux jetons. Donc, il est tokenizing à la fois sur // et /, et donc le résultat.


Je préférerais String#split sur StringTokenizer. C'est plus facile à utiliser et a plus d'options. Il peut prendre Regex en tant que paramètre, et retourne un array de tokens que vous pouvez utiliser plus tard: -

String mStr = "abcd//aaa//32434//3/34343"; 

String[] arr = mStr.split("//"); 
System.out.println(Arrays.toString(arr)); 

Sortie: -

[abcd, aaa, 32434, 3/34343] 
3

De http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html:

Une instance de StringTokenizer se comporte dans l'une des deux manières, selon qu'il a été créé avec le drapeau de returnDelims ayant la valeur vraie ou fausse:

  • Si le drapeau est faux, les caractères délimiteurs servent à séparer les jetons. Un jeton est une séquence maximale de caractères consécutifs qui ne sont pas des délimiteurs.
  • Si l'indicateur est vrai, les caractères de délimitation sont eux-mêmes considérés comme des jetons. Un jeton est donc soit un caractère délimiteur, soit une séquence maximale de caractères consécutifs qui ne sont pas des délimiteurs.

StringTokenizer sera toujours divisée sur les caractères délimiteurs consécutifs, et non sur la chaîne de delimiter lui-même. Ainsi, votre scission est "n'importe quel nombre de barres obliques ou de barres obliques". // est deux barres obliques ou barres obliques; / est un slash ou un slash. Ainsi, votre StringTokenizer fera correspondre les deux séquences en tant que séparateurs. En d'autres termes, votre StringTokenizer équivaut à fractionner l'expression régulière suivante: [//]+, et non // comme vous le pensiez.

2

StringTokenizer est une classe très simple. Si vous voulez une fonctionnalité de type jeton, vous pouvez utiliser Scanner, car il considère la chaîne de délimitation comme une expression régulière.

String mStr = "abcd//aaa//32434//3/34343"; 
    Scanner scanner = new Scanner(mStr); 
    scanner.useDelimiter("//"); 
    while (scanner.hasNext()) { 
     System.out.println(scanner.next()); 
    } 
1

- Méthodesplit() de String ferait très bien, avec // avec delimiter.

public class Reg { 

    public static void main(String[] args){ 

     String s = "abcd//aaa//32434//3/34343"; 
     String[] arr = s.split("//"); 

       for (String x : arr){ 

      System.out.println(x); 
     } 
     } 
} 
Questions connexes