1

我需要在 Unix 和 Windows 上处理以下文件:

a;b
c;d;e;f;g
c;d;e;f;g
c;d;e;f;g

a;b
c;d;e;f;g
c;d;e;f;g
c;d;e;f;g

a;b

a;b
c;d;e;f;g
c;d;e;f;g
c;d;e;f;g

我需要处理a;b包含下面的数据块。例如,不应处理第三个。 a;b

目前,我正在使用 Java 扫描器在文件中使用以下正则表达式来分隔此类文本:

Scanner fileScanner = new Scanner(file);
        try{

            fileScanner.useDelimiter(Pattern.compile("^$", Pattern.MULTILINE));

            while(fileScanner.hasNext()){
                String line;
                while ((line = fileScanner.nextLine()).isEmpty());
                InputStream is = new ByteArrayInputStream(fileScanner.next().getBytes("UTF-8"));
...

这仍然会将第三个 a;b空输入委托给 ByteArrayInputStream。

我可以检查第一行fileScanner.next()是否为空行,然后执行 nextLine() 语句和下面的 continue 语句吗?

4

1 回答 1

1

使用正则表达式模式

(?m)^(?:.+(?:\\r?\\n|\\Z)){2,}

它匹配两行或多行非空行,或者换句话说,两行或多(?:...){2,}行包含一个或多个字符.+,后跟换行符\\r?\\n(?:...|...)字符串结尾\\Z

多行修饰符(?m)意味着^匹配每行的开头,而不仅仅是字符串的开头。


演示:

String str = "...";

Pattern p = Pattern.compile("(?m)^(?:.+(?:\\r?\\n|\\Z)){2,}");
Matcher m = p.matcher(str);
while (m.find()) {
  String match = m.group();
  System.out.println(match);
}

请参阅此演示

于 2012-11-05T13:04:41.410 回答