Fragen zur Verwendung von regulären Ausdrücken

Davicito

Erfahrenes Mitglied
Hallo liebe Forum-Gemeinde,

ich versuche gerade Word-Dokumente (*.doc) mit Java einzulesen. Dabei teile ich Zeilen-Streams (String-Buffer), mit Hilfe der Split-Methode, in Tokens auf.
Anschließend möchte ich die Tokens untersuchen, ob es sich um eine Email-Adresse, Telefonnummer etc. handelt. Für die Token-Analyse verwende ich "reguläre Ausdrücke" mit der Pattern-Klasse.

Mein bisheriger Quell-Code:
Java:
import java.io.*;
import java.util.regex.Pattern;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

public class Model{
    ...
    public void readFile(){
        try{           
            fis = new FileInputStream("C:\\test.doc");
            doc = new HWPFDocument(fis);
            we = new WordExtractor(doc);          
            fis.close();      
        }
        catch(Exception e){
            e.printStackTrace();
        }

        for(String para: we.getParagraphText()){
            String[] tokens = para.split("[\\t:;, ]+");
            for(int i=0; i < tokens.length; i++){
               if(Pattern.matches("[a-zA-Z0-9-_]+@[a-zA-Z0-9-_]+\\.[a-z]{2,3}", tokens[i])){
                    System.out.print(tokens[i]);
                }
               else if(tokens[i].equalsIgnoreCase("Telefon")){
                    System.out.print(tokens[i+1]);
               }
        }
    }
}

In einer Word-Datei "Test.doc" habe ich eine Email-Adresse zu stehen:

Adresse Hochmeisterstr.3a
Anschrift: kei_der-dam-m- 23
Hallo World tabukator
Telefon 24567987
Das ist eine Word-Datei
Das ist eine weitere Zeile
E-Mail gehsj@jsd.com
lkjl


Leider wird mir die Email auf der Console nicht angezeigt.

Kann mir jemand sagen, was an meinem Pattern falsch wäre?

LG
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

so aus dem Stand nicht, aber hier mal das Pattern, mit dem in unserer Software E-Mailadressen geprüft werden
Java:
Pattern p = Pattern.compile( "^([_a-zA-Z0-9-]+)(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{1,3})[ ]*[a-zA-Z .,:;]*$" );

Gruß Klaus
 

Davicito

Erfahrenes Mitglied
Leider hilft mir das nicht sehr weiter.
Was ich noch nie gesehen habe ist die Verwendung der halbrunden Klammern. Ich glaube jedoch, dass diese sogar überflüssig sind.

LG
 

vfl_freak

Premium-User
Moin,


Falls Du mit "halbrunden Klammern" (???) dies hier meinst: ( ), werden damit gewisse Gegebenheiten zusammengefasst!

Und warum hilft Dir das nicht weiter???

Gruß Klaus
 

Davicito

Erfahrenes Mitglied
Weil ich auch mit Deinem Ausdruck keine Email-Adresse angezeigt bekomme.

Java:
else if(Pattern.matches("^([_a-zA-Z0-9-]+)(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{1,3})[ ]*[a-zA-Z .,:;]*$", tokens[i])){  
       System.out.print(tokens[i]);  
}
 

vfl_freak

Premium-User
hmm,
habe Deine E-Mailadresse von oben ("gehsj@jsd.com") mal mit meinen Ausdruck getestet und die Adresse wird sauber gefunden!

Hier kannst Du es selbst testen:
http://www.rubular.com/r/D8xmoDbgq6

Zuerst gibst Du den Ausdruck ein
([_a-zA-Z0-9-]+)(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{1,3})[ ]*[a-zA-Z .,:;]*
dann Deine Testadresse
gehsj@jsd.com
und Du bekommst das Ergebis aus dem Anhang

Was genau steht denn überhaupt auf "tokens"??
Und schau mal im Debugger, ob überhaupt dort durchgelaufen wird ...

Gruß Klaus
 

Anhänge

  • ScreenShot.JPG
    ScreenShot.JPG
    50,5 KB · Aufrufe: 9

Davicito

Erfahrenes Mitglied
Ui... :) die Seite kenn ich ja noch nett ^^. Die werde ich mir auf jeden Fall mal für reguläre Ausdrücke, in meine Favoriten-Liste aufnehemen ;-).
Auch mein Ausdruck wird akzeptiert: [a-zA-Z0-9-_]+@[a-zA-Z0-9-_]+\.[a-z]{2,3}
Nur dann verstehe ich nett wieso ich nichts angezeigt bekomme!?

nehmen wir einmal an, ich prüfe, ob das Token davor das Key-Word "E-Mail" beinhalten müsste das darauffolgende eine Email-Adresse sein. So prüfe ich

Java:
if(Pattern.matches("[Ee-]{1,2}?[Mm]ail", tokens[i])){  
     //Ausgabe des Key-Word "E-Mail"
     System.out.print(tokens[i]);  
     //Ausgabe des darauffolgenden Tokens
     if(tokens[i+1] != null) 
        System.out.print(tokens[i+1]);
  }

Konsolen-Ausgabe: E-Mail gehsj@jsd.com

Wenn ich aber direkt nach einer Email suche mit den typischen Charaktereigenschaften (@ . ) findet er mit Hilfe meines regulären Ausdrucks - wie bereits geprüft auf http://www.rubular.com/r/D8xmoDbgq6 getestet, keinen Token mit der Email "gehsj@jsd.com"aus meiner Test.doc.
 
Zuletzt bearbeitet:

Davicito

Erfahrenes Mitglied
...nehmen wir einmal an, ich prüfe, ob das Token davor das Key-Word "E-Mail" beinhalten müsste das darauffolgende eine Email-Adresse sein. So prüfe ich...

Java:
if(Pattern.matches("[Ee-]{1,2}?[Mm]ail", tokens[i])){
     //Ausgabe des Key-Word "E-Mail"
     System.out.print(tokens[i]);
     //Ausgabe des darauffolgenden Tokens
     if(tokens[i+1] != null)
        System.out.print(tokens[i+1]);
  }

Konsolen-Ausgabe: E-Mail gehsj@jsd.com

Wenn ich aber direkt nach einer Email suche mit den typischen Charaktereigenschaften (@ . ) findet er mit Hilfe meines regulären Ausdrucks - wie bereits auf http://www.rubular.com/r/D8xmoDbgq6 getestet, keinen Token mit der Email "gehsj@jsd.com"aus meiner Test.doc.
Java:
if(Pattern.matches("[Ee-]{1,2}?[Mm]ail", tokens[i]) && Pattern.matches("[a-zA-Z0-9-_]+@[a-zA-Z0-9-_]+\\.
            [a-z]{2,3}", tokens[i+1])){ 
       System.out.print(tokens[i+1]);
}
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Solltest Du dann im rechten Teil der &&-Abfrage nicht auch auf "tokens[i+1]" prüfen ??? :cool:

BTW:
{1,2} und gleichzeitig '?' ist vermutlich Murks!
{1,2} besagt "1 oder 2"
? besagt "0 oder 1"

zudem: durch "[Ee-]{1,2}" ist auch der Ausdruck "Eemail" gültig !!

EDIT:
Versuch es mal so: [Ee]-?[Mm]ail