我有一个StreamTokenizer,可以对String进行标记。我感兴趣的是从String中获取下一个标记的方法,以及剩余的String(没有我们刚刚使用的标记)。
public static void parseString(String s){
StreamTokenizer st = new StreamTokenizer(new StringReader(s));
try {
while (st.nextToken() != st.TT_EOF){
if (st.ttype == st.TT_WORD){
System.out.println("Word: " + st.sval);
if (st.sval.equals("start")){
start(st.sval, ???)
}
}
else if (st.ttype == st.TT_NUMBER){
System.out.println("Number: " + st.nval);
}
else if (st.ttype == '\''){
System.out.println(st.sval);
}
else{
System.out.println((char)st.ttype);
}
}
} catch (IOException e){}
}
public String start(String text, String theRest){
return "<start>" + text + "" + parseString(theRest) + "</start>";
}
我尝试过的一些事情:
我尝试过只使用原始的String,但StreamTokenizer在对它进行标记后不会改变它(我忘记了这个词来描述它)。
我可以找到当前令牌的索引,并将该令牌从原始字符串中分割出来。
我想知道是否有更优雅的方式来解决这个问题?
答案 0 :(得分:1)
关于第一个要点,我相信你想到的这个词可能是&#34;不可变的&#34;。你纠正了,任何似乎在操纵String的东西实际上是在创建一个新的字符串;原件保持不变。
对于第二个要点,坦率地说我也会提出相同的建议。目前我想不出更好的方法。
这是一个一般例子:
int startIndex = s.indexOf(currentToken) + currentToken.length;
String remainingString = s.subString(startIndex, s.length-1);
如果我的字符串是&#34;您好我的名字是Paul&#34;,并且当前令牌是&#34;名称&#34;,remainingString
的结果应该是&#34;是保罗&#34;。
您可以轻松地将其封装在某个帮助程序中,以帮助保持清洁和分离。
可能不是你正在寻找的答案,但希望这有点帮助。