【问题标题】:String tokenizer and piping symbol字符串标记器和管道符号
【发布时间】:2014-11-04 14:00:43
【问题描述】:
    String s = "test -||- testing again -|- test_1 -||- testing again_1";
    StringTokenizer tokenizer = new StringTokenizer(s,"-|-");
    System.out.println(tokenizer.countTokens());

    while(tokenizer.hasMoreTokens()) {
        System.out.println(tokenizer.nextToken());
    }

输出:

4
test 
 testing again 
 test_1 
 testing again_1

计数不应该是 2..?

我尝试打印令牌,所有字符串都打印出来了。不仅应该被视为令牌。

我还从 java API 文档中阅读了以下内容,

分隔符用于分隔标记。令牌是最大值 不是分隔符的连续字符序列

如果是这种情况,我的分隔符“-|-”不应该用于将字符串分成 2 个吗?

【问题讨论】:

  • 你打印了令牌吗?
  • @vefthym 是的,我做到了。请检查我的编辑。
  • 如果有 4 个令牌 (1||2|3||4),为什么要打印 2 而不是 4?请注意,双管道 (||) 被认为是中间有一个空(因此被忽略)标记的分隔符。
  • @BlackPanther 看看 Seelenvirtuose 的回答:StringTokenizer 使用单独的 characters 作为分隔符,您的引用指出标记 in between 可能是更长的序列字符,但分隔符是在构造函数中传递的任何字符序列,即-|- 将导致分隔符匹配任何减号和管道序列,例如|---|--|||- 也是一个有效的分隔符。要拆分整个字符串,您需要使用 String#split() 等。

标签: java string stringtokenizer


【解决方案1】:

StringTokenizer 使用 一组分隔符,而不是您显然假设的分隔字符串。

因此,它需要所有出现的 any 定界字符并围绕它们进行标记。这将导致您获得四个令牌(省略空令牌)。

如果你想用一个分隔字符串拆分字符串,你必须使用String.split,它接受一个正则表达式:

String s = "test -||- testing again -|- test_1 -||- testing again_1";
String[] split = s.split("-\\|-"); // "|" is a special char in regex
System.out.println(split.length);

输出为“2”。

【讨论】:

  • 我确信 split 会起作用.. 但是为什么分词器不起作用..?你能详细说明一下吗..?
  • @BlackPanther 重读第一句:“StringTokenizer 使用一组 分隔符”——这意味着如果你通过 @,你基本上是在定义一个像 [-\|]+ 这样的正则表达式987654327@作为分隔符(虽然没有使用正则表达式但效果大致相同)。
  • @BlackPanther 字符串标记器使用分隔符集中的每个单个字符进行标记。在您的示例中,它使用 '-' 和 '|'用于标记化(第二个“-”因此是多余的)。拆分使用整个正则表达式进行拆分。
  • @BlackPanther 如果我没记错的话 StringTokenizer 的第二个参数 "-|-" 本身不是分隔符,而是应该用作分隔符的字符集,因此它与 "-|" 相同,这意味着您正在拆分在-|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多