2011-07-24 3 views
0

Je dispose d'un fichier de boîte aux lettres contenant plus de 50 Mo de messages séparés par quelque chose comme ceci:Expression régulière pour le courrier en-tête du message

De - Thu Jul 19 07:11:55 2007

Je veux construire un expression régulière pour ce en Java pour extraire chaque message électronique un à la fois, donc j'essayé d'utiliser un scanner, en utilisant le modèle suivant comme séparateur:

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; 

} 

cela semble que cela devrait fonctionner, mais chaque fois que je l'exécuter , le programme se bloque, probablement parce qu'il ne trouve pas le motif. Cette même expression régulière fonctionne en Perl avec le même fichier, mais en Java, elle se bloque toujours sur le String current_line = scanner.next(mail_header_pattern);

Cette expression régulière est-elle correcte ou suis-je en train d'analyser le fichier de façon incorrecte?

Répondre

1

je serais en se penchant vers quelque chose beaucoup plus simple, en lisant simplement lignes, quelque chose comme ceci:

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 
    } 
} 
+0

Eh oui, bien que string.split() (et le remplacement^avec les nouvelles lignes et y mettre fin avec une nouvelle ligne) peut être une solution encore plus simple. – Voo

Questions connexes