Java 扫描器和行延续

标签 java java.util.scanner

我想从文件中读取记录。一条记录可以跨越多行。这些线通过“-”(减号)连接。 示例文件:

Alice, 23, SampleRoad 120, SampleTown
Bob, 25, SampleRoad 15A, SampleTown, -
     Tel: 0545848, Mail: bob@hotmail.com
Chris, 27, SampleRoad, SampleTown

我使用 Scanner 类来读取文件:

private static void readFile(String fileName) {

    Pattern PATTERN_RECORD = Pattern.compile(".*", Pattern.MULTILINE);

    try {
        File file = new File(fileName);
        Scanner scanner = new Scanner(file);
        scanner.useDelimiter("(?!-)[\\r\\n]+"); //not a '-' followed by crlf

        int iRecord = 0;
        while (scanner.hasNext(PATTERN_RECORD)) {
            System.out.println(++iRecord + ": " + scanner.next());
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

我的理解是扫描仪分隔符模式定义了作为“记录”处理的内容。

这是结果:

1: Alice, 23, SampleRoad 120, SampleTown
2: Bob, 25, SampleRoad 15A, SampleTown, -
3:          Tel: 0545848, Mail: bob@hotmail.com
4: Chris, 27, SampleRoad, SampleTown

这就是我想要的:

1: Alice, 23, SampleRoad 120, SampleTown
2: Bob, 25, SampleRoad 15A, SampleTown, Tel: 0545848, Mail: bob@hotmail.com
3: Chris, 27, SampleRoad, SampleTown

也许 Scanner 类不适合这里

最佳答案

问题是你的分隔符正则表达式。您应该使用后视而不是前视。尝试像这样更改它:

scanner.useDelimiter("(?<!-)[\\r\\n]+");

关于Java 扫描器和行延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6730976/

相关文章:

Java String Scanner 输入不等待信息,直接移动到下一条语句。如何等待信息?

java - Runnable/Thread 可能的误解

java - 如何在 JavaScript 中设置变量的上下文路径

Java:流、读取器、字符缓冲区、字符串生成器等之间可能的泛化?

Java在主线程中监听套接字时读取线程中的控制台输入

java - 用户输入抛出 NegativeArraySizeException;相同的硬编码(均为正数)数字有效

Java序列化到文件

使用外部库构建 Java Ant

java - 输入 在输入前添加一行文字

java - 读取文件并将名称和数字存储在两个数组中