即使下一个标记似乎适合数据类型,Java 扫描器也会抛出 InputMismatchException

标签 java regex io java.util.scanner inputmismatchexception

我目前正在使用 Java Scanner 类,但遇到了一个非常奇怪的 InputMismatchException。我像这样初始化扫描仪:

Scanner in = new Scanner(new File(fileName));

in.useDelimiter("\n?.*:");

当我打电话System.out.println(in.next());时,它打印 1500到命令行,这是正确的值。但是,如果我调用 System.out.println(in.nextInt());扫描仪抛出一个InputMismatchException。我不认为我正在打印尾随换行符或空格,而且我有点不明白为什么会发生这种情况。

编辑:这是我正在阅读的数据格式:

Data Description:100 Next Data Description:200

编辑:调用Integer.parseInt(in.next());结果是 NumberFormatException: For input string: "1"00 .

最佳答案

InputMismatchException 一点也不奇怪,因为您的正则表达式不跨平台兼容。您可能是 Windows 用户,因此您的文本文件将包含 \r\n 作为行结尾,而不仅仅是 \n

因此正确的模式是:

in.useDelimiter("\r?\n?.*:");

接受\r\n或单个\n

您还可以尝试使用 System.lineSeparator() 来支持不同的行结尾,但随后您需要用括号将其括起来,以便正则表达式量词 ?适用于 Windows 系统的两个字符 \r\n:

in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator()));

这种方法的问题是,当使用 Windows 作为操作系统,但从其他地方接收文件时,它会失败,而其他地方本身只使用 \n。所以我推荐第一种方法。

关于即使下一个标记似乎适合数据类型,Java 扫描器也会抛出 InputMismatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44975327/

相关文章:

java - 用户只能选择 JavaFX 之一的图像按钮

java - 根据文件模板生成多个文件

python - 将括号中的所有字符存储在字符串中

c# - Directory.Move 不适用于 UNC 路径

Java线程: synchronized blocks

java - 并行流 Java 8 的 CPU 核心数

regex - 如何使用 Golang 正则表达式查找完全匹配的单词?

regex - 正则表达式匹配任何重复超过 10 次的字符

C++ 浮点控制台输出问题

java - 有没有办法做到这一点,这样我就没有 64 个 if 语句?