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下にデータのブロックを含む処理が必要です。たとえば、3 番目 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"));
...

これにより、 3 番目 a;bの空の入力が ByteArrayInputStream に委任されます。

の最初の行がfileScanner.next()空行かどうかを確認してから、nextLine() ステートメントとそれに続く continue ステートメントを実行してもよろしいですか?

4

1 に答える 1

1

正規表現パターンを使用

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

これは、2 つ以上の空でない行、または(?:...){2,}1 つ以上の文字の.+後に改行\\r?\\nまたは(?:...|...)文字列の末尾が続く 2 つ以上の行に一致します\\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 に答える