2010-03-01 37 views
21

我有一个文本文件,其中包含由'|'分隔的数据。我需要获取每个字段(由'|'分隔)并处理它。该文本文件可以如下图所示:Java中的字符串标记器

ABC | DEF || FGHT

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

我的结果应该是 - ABC,DEF, “”,FGHT但我正在逐渐ABC,DEF,FGHT

回答

56

StringTokenizer文档:

的StringTokenizer是一个遗留类 保持兼容性的原因 虽然它的使用是在新 代码气馁。建议任何寻求此功能的 都使用String的 拆分方法或代替使用java.util.regex包的 。

下面的代码应该工作:

String s = "ABC|DEF||FGHT"; 
String[] r = s.split("\\|"); 
2

您可以使用需要一个额外的 'returnDelims' 布尔型构造,并通忠于它。 这样您将收到分隔符,这将允许您检测这种情况。

或者你可以实现你自己的字符串标记器,它可以做你需要的东西,但并不那么难。

9

的StringTokenizer忽略空元素。考虑使用1.4中的String.split。

从的javadoc:

的StringTokenizer是一个遗留类 保持兼容性的原因 虽然它的使用是在新 代码气馁。建议任何寻求此功能的 都使用String的 拆分方法或代替使用java.util.regex包的 。

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需要Enumeration的情况。

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

2

它是简单的,因为这...

import java.util.StringTokenizer; 

    class stringtoken{ 
     public static void main (String args[]){ 

      String s1 = "StringTokenizer by Himal"; 

      StringTokenizer stt = new StringTokenizer(s1," "); 

      while (stt.hasMoreTokens()){ 
       String token = stt.nextToken(); 
       System.out.println(token); 
      } 
     } 
    } 

结果:

StringTokenizer 
    by 
    Himal 
+0

由分隔的输入数据“|”和StringTokenizer类只捕获空白? – Azi

+0

不,我们可以使用任何分隔符。它可以是空格,字符,任何字符串集合。 – MacKa

2

包com.java.String;

import java.util.StringTokenizer;

公共类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); 

} 

}

输出:

输入字符串以扭转

原始字符串是:THIS IS ASHIK SKLAB

反转串是:SKLAB ASHIK就是这个

+0

不错的代码! +1 :) – ADJ

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; 
    } 
+0

此答案不添加任何内容。就此而言,正如接受的答案(2010年发布的那样)指出,建议不要使用'StringTokenizer'开头。 – Radiodef