我正在尝试断开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
为什么会发生这种情况,解决方案是什么?我不想用其他字符替换"/"。
StringTokenizer
将这两个标记都作为单独的标记,并对它们进行标记化。因此,它对//
和/
都进行了标记化,从而得到了结果。
比起StringTokenizer
,我更喜欢String#split
。它更易于使用,并且有更多的选择。它可以将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]
来源http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html:
StringTokenizer的实例有两种行为之一,这取决于它是用值为true还是false的returnDelims标志创建的:
- 如果标志为false,则分隔符用于分隔标记。令牌是不是分隔符的连续字符的最大序列
- 如果标志为true,则分隔符字符本身被视为标记。因此,令牌要么是一个分隔符,要么是不是分隔符的连续字符的最大序列
StringTokenizer
将始终在连续的分隔符上拆分,而不是在分隔符字符串本身上拆分。因此,您的拆分是";任意数量的斜线或斜线";。CCD_ 10是两个斜线或斜线;/
是一个斜线或斜线。因此,您的StringTokenizer
将作为分隔符匹配这两个序列。
换句话说,您的StringTokenizer
相当于对以下正则表达式进行拆分:[//]+
,而不是您所认为的//
。
StringTokenizer
是一个非常简单的类。如果您想要类似令牌化器的功能,可以使用Scanner
,因为它将delimeter字符串视为正则表达式。
String mStr = "abcd//aaa//32434//3/34343";
Scanner scanner = new Scanner(mStr);
scanner.useDelimiter("//");
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
-String
的split()
方法就可以了,//
和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);
}
}
}