Регулярное выражение для сообщения заголовка почты - PullRequest
0 голосов
/ 24 июля 2011

У меня есть файл почтового ящика, содержащий более 50 мегабайт сообщений, разделенных чем-то вроде этого:

От - Чт 19 июля 07:11:55 2007

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

public boolean ParseData(DataSource data_source) {

    boolean is_successful_transfer = false;
    String mail_header_regex = "^From\\s";
    LinkedList<String> ip_addresses = new LinkedList<String>();
    ASNRepository asn_repository = new ASNRepository();

    try {       

    Pattern mail_header_pattern = Pattern.compile(mail_header_regex);

    File input_file = data_source.GetInputFile();

    //parse out each message from the mailbox
    Scanner scanner = new Scanner(input_file);      

    while(scanner.hasNext(mail_header_pattern)) {


    String current_line = scanner.next(mail_header_pattern);

    Matcher mail_matcher = mail_header_pattern.matcher(current_line);

        //read each mail message and extract the proper "received from" ip address 
        //to put it in our list of ip's we can add to the database to prepare
        //for querying.
        while(mail_matcher.find()) {
            String message_text = mail_matcher.group();                 
            String ip_address = get_ip_address(message_text);

            //empty ip address means the line contains no received from
            if(!ip_address.trim().isEmpty()) 
                ip_addresses.add(ip_address);
        }

    }//next line

        //add ip addresses from mailbox to database 
        is_successful_transfer = asn_repository.AddIPAddresses(ip_addresses);           

    }

    //error reading file--unsuccessful transfer
    catch(FileNotFoundException ex) {
        is_successful_transfer = false;
    }

    return is_successful_transfer;

}

Кажется, что это должно работать, но всякий раз, когда я запускаю его, программа зависает, вероятно, из-за того, что она не находит шаблон.Это то же самое регулярное выражение работает в Perl с тем же файлом, но в Java оно всегда висит на String current_line = scanner.next(mail_header_pattern);

Это правильное регулярное выражение или я неправильно анализирую файл?

1 Ответ

1 голос
/ 24 июля 2011

Я бы склонялся к чему-то намного проще, просто прочитав строки , что-то вроде этого:

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.matches("^From\\s.*")) {
       // it's a new email
    } else {
       // it's still part of the email body
    }
}
...