我有一个文本文件,其中包含由“|”分隔的数据。我需要得到每个字段(用'|'分隔)并处理它。文本文件如下所示:
ABC | DEF || FGHT
我正在使用字符串标记器(JDK 1.4)来获取每个字段值。现在的问题是,我应该在DEF之后得到一个空字符串。但是,我没有得到DEF&之间的空白区域。 FGHT。
我的结果应该是 - ABC,DEF,“”,FGHT 但我得到 ABC,DEF,FGHT
答案 0 :(得分:60)
来自StringTokenizer
文档:
StringTokenizer是一个遗留类 因兼容性原因而保留 虽然在新的情况下不鼓励使用它 码。任何人都可以推荐 寻求此功能使用 分裂方法的String或 而是java.util.regex包。
以下代码应该有效:
String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
答案 1 :(得分: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));
答案 2 :(得分:9)
StringTokenizer忽略空元素。考虑使用String.split,它也可以在1.4中使用。
来自javadocs:
StringTokenizer是一个遗留类 因兼容性原因而保留 虽然在新的情况下不鼓励使用它 码。任何人都可以推荐 寻求此功能使用 分裂方法的String或 而是java.util.regex包。
答案 3 :(得分:2)
你可以使用带有额外'returnDelims'布尔值的构造函数,并将true传递给它。 通过这种方式,您将收到分隔符,这将允许您检测到这种情况。
或者你可以实现你自己的字符串标记器来完成你需要的东西,这并不难。
答案 4 :(得分: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;
}
答案 5 :(得分: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就是这个
答案 6 :(得分: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();
}