3

我正在尝试在 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

4 回答 4

9

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]
于 2012-11-30T06:13:24.963 回答
3

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

StringTokenizer 实例的行为方式有两种,具体取决于它是使用 returnDelims 标志创建的,其值为 true 或 false:

  • 如果标志为假,则分隔符用于分隔标记。记号是非分隔符的连续字符的最大序列。
  • 如果标志为真,则分隔符本身被视为标记。因此,标记要么是一个分隔符,要么是非分隔符的最大连续字符序列。

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

换句话说,你StringTokenizer相当于拆分以下正则表达式:[//]+,而不是//你想象的那样。

于 2012-11-30T06:11:29.083 回答
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());
    }
于 2012-11-30T06:16:15.233 回答
1

- split()的方法String会做得很好,//with 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);
        }
       }
}
于 2012-11-30T06:17:14.820 回答