如何在java中使用tokenizer,分隔符?

时间:2016-12-11 12:41:27

标签: java delimiter stringtokenizer

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

  

OPCODE R1,R2,R3
  OPCODE 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作为输出。另外,在第二行的情况下,我不希望#。我该怎么做?我做错了什么?

2 个答案:

答案 0 :(得分:0)

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包。

答案 1 :(得分:0)

现在不推荐使用StringTokenizer类。建议使用String类的split()方法或正则表达式(正则表达式)。

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

您在引号中提到的内容将充当令牌之间的分割器。

您还可以使用subString方法删除"#"。