我试图在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
为什么会这样,它的解决方案是什么?我不想用其他字符替换“/”。
答案 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);
}
}
}