22

我有一个文本文件,其中包含由“|”分隔的数据。我需要获取每个字段(由“|”分隔)并处理它。文本文件可以如下所示:

ABC|DEF||FGHT

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

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

4

7 回答 7

60

StringTokenizer文档:

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

以下代码应该可以工作:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
于 2010-03-01T14:04:45.617 回答
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;
}

这打印

ABC
DEF
null
FGHT

API 并不漂亮,因此被认为是遗留的(即“几乎过时”)。仅在模式匹配成本太高(仅适用于极长字符串的情况)或 API 需要枚举的情况下使用它。

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

于 2010-03-01T14:07:14.600 回答
9

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

从javadocs:

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

于 2010-03-01T14:06:01.480 回答
2

您可以使用带有额外“returnDelims”布尔值的构造函数,并将 true 传递给它。这样您将收到分隔符,这将使您能够检测到这种情况。

或者,您可以实现自己的字符串标记器来满足您的需要,这并不难。

于 2010-03-01T14:03:21.113 回答
2

这是解决此问题的另一种方法

   String str =  "ABC|DEF||FGHT";
   StringTokenizer s = new StringTokenizer(str,"|",true);
   String currentToken="",previousToken="";


   while(s.hasMoreTokens())
   {
    //Get the current token from the tokenize strings
     currentToken = s.nextToken();

    //Check for the empty token in between ||
     if(currentToken.equals("|") && previousToken.equals("|"))
     {
        //We denote the empty token so we print null on the screen
        System.out.println("null");
     }

     else
     {
        //We only print the tokens except delimiters
        if(!currentToken.equals("|"))
        System.out.println(currentToken);
     }

     previousToken = currentToken;
   }
于 2015-03-29T05:50:48.097 回答
0
package com.java.String;

import java.util.StringTokenizer;

public class StringWordReverse {

    public static void main(String[] kam) {
        String s;
        String sReversed = "";
        System.out.println("Enter a string to reverse");
        s = "THIS IS ASHIK SKLAB";
        StringTokenizer st = new StringTokenizer(s);


        while (st.hasMoreTokens()) {
            sReversed = st.nextToken() + " " + sReversed;
        }

        System.out.println("Original string is : " + s);
        System.out.println("Reversed string is : " + sReversed);

    }
}

输出:

输入要反转的字符串

原始字符串是:这是 ASHIK SKLAB

反转的字符串是:SKLAB ASHIK IS THIS

于 2013-11-21T12:15:59.443 回答
0

这是一种将字符串拆分为标记的方法(标记是一个或多个字母)

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    s = s.replaceAll("[^A-Za-z]", " ");
    StringTokenizer arr = new StringTokenizer(s, " ");
    int n = arr.countTokens();
    System.out.println(n);
    while(arr.hasMoreTokens()){
        System.out.println(arr.nextToken());
    }
    scan.close();
}
于 2018-06-20T19:19:25.297 回答