2017-01-06 6 views
3

У меня есть файл в следующем формате, записи разделены символом новой строки, но в некоторых записях есть строка в них, как показано ниже. Мне нужно получить каждую запись и обработать их отдельно. Размер файла может быть несколько Мб.Как разбить файл на токены на основе регулярных выражений с помощью Java

<?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(); 

Но результат я получил иметь начинающуюся < \? удалено:

aaaaa> 
bbbb 
    bb> 
cccccc> 

Я знаю, что сканер потребляет любые входные данные, соответствующие шаблону разделителя. Все, что я могу придумать, это добавить шаблон разделителя назад к каждой записи mannully.

Есть ли способ НЕ удалять шаблон деминера?

ответ

5

Перерыв на новой строке только тогда, когда предшествуют ">" полукокса:

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

\R система независимая новая строка
(?<=>) является взглядом за что утверждает (без потребления), что предыдущий символ является >

Плюс это круто, потому что <=> выглядит как Darth Vader's TIE fighter.

+0

(смеется) Так что это делает ! – DevilsHnd

+0

Я протестировал его, это сработало! Спасибо огромное! – jlp

+0

Я тестировал с большим количеством записей, и этот подход сделал некоторые записи в одной строке. Не могли бы вы помочь? – jlp

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 

Не стесняйтесь спрашивать о новых вопросах, которые могут возникнуть у вас!

+0

Файл может быть размером в несколько мегабайт, не уверен, что он вызовет проблемы при сохранении всего файла в строке. – jlp

+0

@jlp Я бы не стал беспокоиться о том, что файлы имеют размер в несколько мегабайт, но вы правы, что этот подход не очень хорошо масштабируется. –

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>