如何使用Java将文件分解为基于正则表达式的标记

时间:2017-01-06 18:32:14

标签: java regex java.util.scanner

我有一个以下格式的文件,记录由换行符分隔,但有些记录中有换行符,如下所示。我需要获取每条记录并单独处理它们。该文件的大小可能只有几个Mb。

 <?aaaaa>
 <?bbbb
     bb>
 <?cccccc>

我有代码:

 FileInputStream fs = new FileInputStream(FILE_PATH_NAME);
 Scanner scanner = new Scanner(fs);
 scanner.useDelimiter(Pattern.compile("<\\?"));
 if (scanner.hasNext()) {
     String line = scanner.next();
     System.out.println(line);
 } 
 scanner.close();

但是我得到的结果是开头的&lt; \?删除:

aaaaa>
bbbb
   bb>
cccccc>

我知道Scanner会消耗任何与分隔符模式匹配的输入。我能想到的就是将分隔符模式添加回每个记录中。(/ p>)

有没有办法不删除分隔符模式?

3 个答案:

答案 0 :(得分:5)

仅在前面有">"字符时打破换行符:

scanner.useDelimiter("(?<=>)\\R"); // Note you can pass a string directly

\R是一个独立于系统的换行符 (?<=>)背后的,断言(不消费)前一个字符是>

此外它很酷,因为<=>看起来像Darth Vader's TIE fighter

答案 1 :(得分:1)

我假设你想在任何地方忽略换行符'\n'

我会阅读whole file into a String然后remove all of the '\n's in the String。这个问题的代码部分是这样的:

String fileString = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
fileString = fileString.replace("\n", "");
Scanner scanner = new Scanner(fileString);
...  //your code

您可以随意提出任何其他问题!

答案 2 :(得分:0)

以下是使用StringBuilder

执行此操作的一种方法
public static void main(String[] args) throws FileNotFoundException {
    Scanner in = new Scanner(new File("C:\\test.txt"));
    StringBuilder builder = new StringBuilder();

    String input = null;
    while (in.hasNextLine() && null != (input = in.nextLine())) {
        for (int x = 0; x < input.length(); x++) {
            builder.append(input.charAt(x));
            if (input.charAt(x) == '>') {
                System.out.println(builder.toString());
                builder = new StringBuilder();
            }
        }
    }

    in.close();
}

<强>输入:

 <?aaaaa>
 <?bbbb
     bb>
 <?cccccc>

<强>输出:

 <?aaaaa>
 <?bbbb     bb>
 <?cccccc>