Java中的字符串标记生成器

ASD*_*ASD 21 java string token

我有一个文本文件,其中包含由'|'分隔的数据.我需要得到每个字段(用'|'分隔)并处理它.文本文件如下所示:

ABC | DEF || FGHT

我使用字符串标记器(JDK 1.4)来获取每个字段值.现在问题是,我应该在DEF之后得到一个空字符串.但是,我没有得到DEF和FGHT之间的空白区域.

我的结果应该是 - ABC,DEF,"",FGHT,但我得到ABC,DEF,FGHT

Des*_*egr 60

来自StringTokenizer文档:

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它.建议任何寻求此功能的人都使用String的split方法或java.util.regex包.

以下代码应该有效:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
Run Code Online (Sandbox Code Playgroud)

  • 但 StringTokenizer 比 split 快 2 倍……你可以自己检查一下 (2认同)

sfu*_*ger 15

使用该returnDelims标志并检查后续出现的两个分隔符:

String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);

boolean expectDelim = false;
while (tok.hasMoreTokens()) {
    String token = tok.nextToken();
    if (delim.equals(token)) {
        if (expectDelim) {
            expectDelim = false;
            continue;
        } else {
            // unexpected delim means empty token
            token = null;
        }
    }

    System.out.println(token);
    expectDelim = true;
}
Run Code Online (Sandbox Code Playgroud)

这打印

ABC
DEF
null
FGHT
Run Code Online (Sandbox Code Playgroud)

API不漂亮,因此被认为是遗留的(即"几乎过时").仅在模式匹配过于昂贵的情况下使用它(对于极长的字符串应该只是这种情况)或者API期望枚举.

如果切换到String.split(String),请确保引用分隔符.手动("\\|")或自动使用string.split(Pattern.quote(delim));


Rya*_*rle 9

StringTokenizer忽略空元素.考虑使用String.split,它也可以在1.4中使用.

来自javadocs:

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它.建议任何寻求此功能的人都使用String的split方法或java.util.regex包.