Java StreamTokenizer将没有空格的数字和字符作为单独的标记

时间:2017-10-03 02:50:06

标签: java numbers inputstream

我正在编写一个StreamTokenizer的解析器。我需要像"8a"这样的输入来回显一个数字包含char的错误。相反,它打印:

NUM: 8 ID: a

似乎将char标识为单独的标记,即使没有空格将它们分开。

有解决方法吗?

2 个答案:

答案 0 :(得分:0)

您可以识别当前令牌是否为StreamTokenizer.TT_WORD并输出错误。检查下面的代码片段,它会使用带有数字和字符的文本,不带空格,并在到达字符时输出错误。

import java.io.*;
public class StreamCharacterChecker{

     public static void main(String []args) throws IOException{
        String text = "123458a787";
        Reader r = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(text.getBytes())));
        StreamTokenizer st = new StreamTokenizer(r);
        int token;
        while ((token = st.nextToken()) != StreamTokenizer.TT_EOF){
            if (token == StreamTokenizer.TT_WORD){
                System.out.println("Error characters detected!");
                break;
            }    
        }
     }
}

答案 1 :(得分:0)

您可以覆盖StringTokenizer的{​​{1}}方法来禁用对数字字符的特殊处理。 请注意,这可能非常危险,否则不合适。

根据javadoc https://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html#parseNumbers()

parseNumbers

以下是示例 - 我没有为数字中使用的典型字符添加“数字”属性:

 * When the parser encounters a word token that has the format of a
 * double precision floating-point number, it treats the token as a
 * number rather than a word, by setting the {@code ttype}
 * field to the value {@code TT_NUMBER} and putting the numeric
 * value of the token into the {@code nval} field.

输出:

  

TT_WORD 8a

使用上述配置,您可以获得 final Reader rd = new StringReader("8a"); final StreamTokenizer tk = new StreamTokenizer(rd) { @Override public void parseNumbers() { // super.parseNumbers(); - by not calling super. I disable special handling of numeric characters } }; tk.wordChars('a', 'z'); tk.wordChars('0', '9'); while ((tk.nextToken()) != StreamTokenizer.TT_EOF) { if (tk.ttype == StreamTokenizer.TT_WORD) { System.out.println("TT_WORD " + tk.sval); } if (tk.ttype == StreamTokenizer.TT_NUMBER) { System.out.println("TT_NUMBER " + tk.nval); } } String,然后执行8a以检查内部是否存在数字。