【问题标题】:How to use tokenizer in java with , delimiters?java - 如何在带有分隔符的Java中使用标记器?
【发布时间】:2016-12-11 12:41:27
【问题描述】:

我有一个示例输入文件如下 -

操作码 R1、R2、R3
操作码 R2,#30

while(scanner.hasNextLine()){
    StringTokenizer st = new StringTokenizer(scanner.nextLine());
    Instruction instruction = new Instruction();
    instruction.setAddress(PC + PC_increment);
    instruction.setOpcode(st.nextToken());
    if(st.hasMoreTokens()) {
        instruction.setDest(st.nextToken());
    }
    if(st.hasMoreTokens()) {
        String nextToken = st.nextToken();
        if(nextToken.charAt(0)== '#') {
            instruction.setSource_1(nextToken.split("#")[1]);
        } 
        else {
            instruction.setSource_1(nextToken);
        }
    }   
    if(st.hasMoreTokens()) {
        instruction.setSource_2(st.nextToken());
    }
}

当我尝试打印令牌时,我得到“R1”和“R2”作为输出。但是,我期望只有 R1 或 R2 作为输出。另外,在第二行的情况下,我不想要#。我该怎么做?我做错了什么?

【问题讨论】:

    标签: java delimiter stringtokenizer


    【解决方案1】:

    StringTokenizer 的默认分隔符是空格字符(空格、制表符、换行符),不是逗号 ,。那么第一行的标记是:“OPCODE”、“R1”、“R2”和“R3”。

    如果你想用空格逗号分割字符串,你应该使用(注意在默认分隔符列表末尾添加的,):

    StringTokenizer st = new StringTokenizer(scanner.nextLine(), " \t\n\r\f,");
    

    还要删除前导#,你可以这样做

    if(nextToken.startWith("#")) {
        instruction.setSource_1(nextToken.substring(1));
    } 
    

    但是,如果您阅读JDK documentation,它会写成:

    StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。

    【讨论】:

      【解决方案2】:

      StringTokenizer 类现已弃用。建议使用 String 类的 split() 方法或 regex(正则表达式)。

      在代码中,标记之间的分隔符是逗号(“,”)所以你必须提到在字符串标记器中,否则默认标记分隔符是“空格”。所以我们必须提到 StringTokenizer st = new StringTokenizer(scanner.nextLine(),",");

      您在引号中提到的任何内容都将充当标记之间的分隔符。

      您也可以使用 subString 方法删除“#”。

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 1970-01-01
        • 2022-01-22
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        相关资源
        最近更新 更多