StringTokenizer与delim" //"无法正常工作

时间:2012-11-30 06:09:09

标签: java string stringtokenizer

我试图在delim“//”上打破字符串。我的字符串也包含“/”和StringTokenizer给出奇怪的结果,它也打破了“/”上的字符串。

  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

为什么会这样,它的解决方案是什么?我不想用其他字符替换“/”。

4 个答案:

答案 0 :(得分:8)

StringTokenizer将两个标记分开,并在两个标记上进行标记。因此,它会对///进行标记,从而产生结果。


我宁愿String#split优先于StringTokenizer。它更容易使用,并有更多的选择。它可以Regex作为参数,并返回array tokens,您可以在以后使用它: -

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

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

输出: -

[abcd, aaa, 32434, 3/34343]

答案 1 :(得分:3)

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

  

StringTokenizer的一个实例以两种方式之一运行,具体取决于它是使用值为true还是false的returnDelims标志创建的:

     
      
  • 如果标志为false,则分隔符用于分隔标记。令牌是不是分隔符的连续字符的最大序列。
  •   
  • 如果标志为true,则分隔符字符本身被视为标记。因此,令牌可以是一个分隔符,也可以是不是分隔符的连续字符的最大序列。
  •   

StringTokenizer将始终拆分连续的分隔符字符,而不是分隔符字符串本身。因此,您的拆分是“任意数量的斜线或斜线”。 //是两个斜杠或斜杠; /是一个斜线或斜杠。因此,您的StringTokenizer会将两个序列都匹配为分隔符。

换句话说,您的StringTokenizer相当于按照您的想法拆分以下正则表达式:[//]+,而不是//

答案 2 :(得分:2)

StringTokenizer是一个非常简单的类。如果您想要类似于tokenizer的功能,可以使用Scanner,因为它将分隔符字符串视为正则表达式。

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

答案 3 :(得分:1)

- split() String方法会很好,//只有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);
        }
       }
}