字符串标记器无法正常工作与 delim "//"



我正在尝试断开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作为参数,并返回tokensarray,您可以稍后使用:-

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());
}

-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);
}
}
}

相关内容

  • 没有找到相关文章

最新更新