Java Scanner模式

时间:2013-06-09 16:14:04

标签: java token

我正在尝试从文件中读取特定文本。文字格式为

@INFO

@DATA
'x', -1, 1 
'y', -1, 1

现在我必须标记@DATA标记

之后的文本
x
-1
1
y
-1
1

现在我得到了这个

Scanner in=null;    
try {
    in=new Scanner(file);
} catch (FileNotFoundException e) {
    return 1;
}

while(in.hasNext() && !in.next().equals("@DATA"));

while(in.hasNext()) {
    try {
        Object[] obj = new Object[3];
        obj[0] = in.next();
        obj[1] = in.nextDouble();
        obj[2] = in.nextDouble();

    } catch(Exception e) {
        return 2;
    }
}
return 0;

它的效果差不多(得到''x',')但是我必须在引号(')之间得到一个字。 in.next("'([^']*)'");不起作用(java.util.InputMismatchException)。如何在@DATA标记之后对这些行进行标记?

1 个答案:

答案 0 :(得分:1)

我认为在你获得令牌后你将不得不处理引号,因为在the Scanner#next(String) method中,正则表达式用于测试下一个令牌,而不是确定下一个令牌。

因此,您不必让tokenizer返回x,而是必须期望tokenizer返回'x',,然后使该输出有效。幸运的是,这并不难。一个快速而肮脏的方法就是这样:

String quotedToken=scanner.next();
quotedToken = quotedToken.replace('\'', ' ');
quotedToken = quotedToken.replace(',', ' ');
quotedToken = quotedToken.trim();

如果您对分隔符有点聪明,可能还值得注意的是,您可以让Scanner为您处理逗号:

`scanner.useDelimiter(",?\\s+");`