我有一个使用StreamTokenizer的简单分词器,它将数学表达式转换为各自的组件(如下)。我遇到的问题是,如果表达式中有一个名为T_1的变量,它将分割为[T,_,1],我想返回为[T_1]。Java Tokenization:将任何由下划线分隔的单词当作一个单词
我试图用变量来检查最后一个字符是否是下划线,如果是这样,将下划线追加到list.Size-1上,但它看起来像一个非常笨重和低效的解决方案。有没有办法做到这一点?谢谢!
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
tokenizer.ordinaryChar('-'); // Don't parse minus as part of numbers.
tokenizer.ordinaryChar('/'); // Don't parse slash as part of numbers.
List<String> tokBuf = new ArrayList<String>();
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) //While not the end of file
{
switch (tokenizer.ttype) //Switch based on the type of token
{
case StreamTokenizer.TT_NUMBER: //Number
tokBuf.add(String.valueOf(tokenizer.nval));
break;
case StreamTokenizer.TT_WORD: //Word
tokBuf.add(tokenizer.sval);
break;
case '_':
tokBuf.add(tokBuf.size()-1, tokenizer.sval);
break;
default: //Operator
tokBuf.add(String.valueOf((char) tokenizer.ttype));
}
}
return tokBuf;
我没有看到你所看到的。如果我传入'T_1',我将它作为输出:'[null,T,1.0]' – 2014-09-26 18:26:41
我觉得'wordChars'与答案有某种关系,但我不知道如何添加* word字符。似乎你只能设置一个范围。令人惊讶的糟糕的Java文档和API,IMO。在'StringTokenizer'上使用'StreamTokenizer'有没有合理的理由? – 2014-09-26 18:31:28
我真的很抱歉,我提供的代码没有完全修复。上面的代码不应该包含'_'的情况。这是我试图将它添加到列表中最后一个元素的遗迹。不,没有正当理由,我正在使用StreamTokenizer。你觉得StringTokenizer是优越的吗? – Archetype90 2014-09-26 18:33:09