2012-11-30 30 views
2

我想破解delim「//」上的字符串。我的字符串也包含「/」和StringTokenizer給出奇怪的結果,它也打破了「/」字符串。StringTokenizer與delim「//」無法正常工作

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

結果是

abcd 
aaa 
32434 
3 
34343 

和預期的結果是

abcd 
    aaa 
    32434 
    3/34343 

爲什麼發生這種情況,什麼是它的解決方案?我不想用其他字符替換「/」。

+0

預期結果是什麼? –

+0

我已更新問題的預期結果@NikolayKuznetsov – Talha

回答

8

StringTokenizer將兩個令牌分開,並在兩者上標記。所以,它在///上都有標記,因此也就是結果。


我寧願String#split超過StringTokenizer。它更易於使用,並有更多選擇。它可以採取Regex作爲參數,並返回tokens,您可以稍後使用array: -

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

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

輸出: -

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

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

的StringTokenizer的實例表現在以下兩種方式之一,這取決於它是否與returnDelims標誌創建具有值true或false:

  • 如果標誌是假的,分隔符用來分隔令牌。令牌是不是分隔符的連續字符的最大序列。
  • 如果該標誌爲真,則分隔符字符本身被認爲是標記。因此,令牌既可以是一個分隔符,也可以是不是分隔符的連續字符的最大序列。

StringTokenizer會分割連續分隔符,而不是分隔符字符串本身。因此,您的分割是「任意數量的斜槓或斜槓」。 //是兩個斜槓或斜線; /是一個斜槓或斜槓。因此,您的StringTokenizer會將兩個序列都作爲分隔符匹配。

換句話說,您的StringTokenizer等同於按照您的想法分割以下正則表達式:[//]+,而不是//

2

StringTokenizer是一個非常簡單的類。如果您想要類似標記器的功能,則可以使用Scanner,因爲它將分隔符字符串視爲正則表達式。

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

-Stringsplit()方法會做就好了,用//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); 
     } 
     } 
}