我有一个示例输入文件,如下所示 -
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作为输出。另外,在第二行的情况下,我不希望#
。我该怎么做?我做错了什么?
答案 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方法删除"#"。