【问题标题】:Multiple delimiters with scanner带扫描仪的多个分隔符
【发布时间】:2014-10-23 00:31:46
【问题描述】:

我正在尝试读取多行文件。内容格式如下:( 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)

我认为不匹配可能是因为扫描仪功能无法识别分隔符。有人可以告诉我我在声明分隔符时是否出错?

【问题讨论】:

  • 我不确定我是否完全遵循这一点。使用 nextDouble 读取具有浮点值 (6.4545) 的字段。这不应该引发不匹配,不是吗?

标签: java java.util.scanner delimiter


【解决方案1】:

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

\{(\s),\}+

Debuggex Demo

您匹配的是文字 {,后跟一个空格和一个逗号,然后是另一个或多个文字 }s。如果你想用逗号分割,你通常只需要:

\s*,\s*

Debuggex Demo

(旁注,Debuggex 很棒,但它不是特定于 Java 的 - 我真的很喜欢 RegexPlanet's tool 玩 Java 模式。)


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多