带扫描仪的多个分隔符

时间:2014-10-23 00:31:46

标签: java java.util.scanner delimiter

我正在尝试阅读多行文件。内容采用以下格式:( 0, 250, 6.4545, 250 ) 我试过使用像

这样的use.Delimiter()函数
r = new FileInputStream ("Z:\\RTS\\HW2\\input.txt");
Scanner src = new Scanner(r);
src.useDelimiter("\\{(\\s),\\}+");
if(r!= null)
{
  i=0;
  while (src.hasNext()) 
  {
    System.out.println(src.nextInt()); // Line 84
    if(src.hasNext())
      a = (double)src.nextInt();
    if(src.hasNext())
    {
      b = (double)src.nextInt();
      period[i] = (int)b;
    }
    if(src.hasNext())
    {
      c = src.nextDouble();
      exTime[i] = c;
    }
    if(src.hasNext())
      d = src.nextDouble();
      src.nextLine();
      i++;
    }
  }

我收到以下例外情况:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at rm.rmcalc.main(rmcalc.java:84)

我认为不匹配可能是因为扫描仪功能无法识别分隔符。有人能告诉我,如果我在宣布分隔符时犯了错误吗?

1 个答案:

答案 0 :(得分:0)

你在这里遇到了很多问题,其中最重要的是你的正则表达式完全是乱码。

\{(\s),\}+

Regular expression visualization

Debuggex Demo

您正在匹配文字{,后跟空格和逗号,然后是另一个或多个文字}。如果您尝试拆分逗号,通常只需要:

\s*,\s*

Regular expression visualization

Debuggex Demo

(Sidenote,Debuggex很棒,但它不是特定于Java的 - 我非常喜欢RegexPlanet's tool来玩Java模式。)


一旦你修好了分隔符,你仍然会遇到问题。您根本没有正确使用扫描仪。首先看一下Java Tutorial on Scanner。至少,您需要将.hasNext*()来电与.next*()来电相配,即在致电hasNextInt()之前致电.nextInt()。但是你也在做一堆复杂的条件处理,这些处理会以奇怪的方式导致格式错误的数据失败。

让我建议一种不同的模式,而不是引导你清理它。通常,当人们想要从文件中读取时,他们会使用两个单独的扫描仪。一个使用默认分隔符,他们只需在其上重复调用.nextLine()。然后,他们将该行传递给具有自定义分隔符的第二个扫描程序,并逐行提取各个组件。这使您可以轻松地测试解析单行,因此您可以与文件读取行为分开调试行解析行为。