regulärer Ausdruck zum Parsen einer E-Mail Signatur

  • Themenstarter Themenstarter MarcelM
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

MarcelM

Gast
Hallo zusammen,

ich habe im Rahmen meiner Ausbildung die Aufgabe bekommen ein Programm zu entwickeln, bei dem man mittels eines Textfelds einen E-Mail Text samt Signatur kopieren kann. Die Signatur soll dabei nach Name, Vorname, Internetadresse, E-Mail, Adresse (Straße, Hausnummer, plz, Ort) aufgeteilt werden.

Anschließend sollen diese Attribute in einer Oracle Datenbank konvertiert werden...

Mein Problem ist dabei, die Attribute zu filtern. Das einzigste was ich bis jetzt erreicht habe, ist die Filterung der E-Mail Adresse mit folgendenm regulären Ausdruck:

Code:
Pattern email = Pattern.compile("[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\\.)+([a-zA-Z]{2,3})");

Ich habe aber momentan absolut keine Idee, wie ich die restlichen Attribute filtern soll. Insbesondere Vorname und Nachname.... aber auch die anderen Attribute...

Wenn ihr dazu vielleicht schon bekannte Lösungen kennt, wäre es schön, wenn ihr mir die mitteillen könntet....


Generell bin ich über jeden Hilfe dankbar....
 
Die Signatur soll dabei nach Name, Vorname, Internetadresse, E-Mail, Adresse (Straße, Hausnummer, plz, Ort) aufgeteilt werden.
Frage: was ist die Signatur einer email? hab ich ja noch nie gehört, dass bei einer email irgendwo hausnummer plz ort dabei sind??

meist du eine vcard als attachment?

oder die "erweiterte Schreibweise" so a la

"vorname nachname" <vornamenachname@domain.de>
 
signatur is i.d.r. der teil des bodies, der durch --(leerzeichen) vom content getrennt wird
 
Na ja also die Signatur sähe bspw folgendermaßen aus:

IT-Service GmbH
Marcel Muster
Musterstr. 10
12345 München
mailto:Marcel.Menze@ewe.de
Homepage: http://www.ewetel.de

Den Text den ich zu Filtern hätte wäre dann ungefähr folgendermaßen....




Guten Tag,

bla blaasdasdasd

adsdsdadasdasdasd
asdsad asd asd984324a asdsasad

asdsad asd432432 sad asd
324 sd ad

as sasd dad324432 asd

Mit freundlichen Grüßen

IT-Service GmbH
Marcel Muster
Musterstr. 10
12345 München
mailto:Marcel.Menze@ewe.de
Homepage: http://www.ewetel.de

Diesen gesamten Inhalt hole ich mir über ein Textfeld und lese es in einen String ein, den jetzt halt noch den oben genannten Kriterien filtern möchte.
 
problem ist, woher weisst du, wann die signatur anfängt? es gibt wohl keinen regulären ausdruck, der erkennt, wann z.b. der firmenname anfängt. entweder du kannst dich auf einen gängigen seperator verlassen, wie z.b. -- (doch selbst da halten sich nicht alle email clients dran) oder du musst halt mehr oder weniger raten. da die email anscheinend aus einem einzigen eingabefeld kommt, wird es wohl auf letztere variante hinauslaufen. evtl. die postleitzahl auslesen (also auf 5 aufeinander folgende zahlen prüfen) und dann die darüberliegenden zeilen mitnehmen? oder versuchen, GmbH/ AG/ Firma etc. zu filtern oder Str. / Straße ... auf jeden Fall werden die Daten nicht sicher sein.

ansonsten halt zusätzliche eingabefelder machen, wo diese daten angegeben werden können. dann könnt ihr die daten auch vernünftig einpflegen.
 
puu, das ist also die signatur?!

leider ist das überhaupt nicht standardisiert, das macht die sache schon schwierig...

Bei

"Mit freundlichen Grüßen" / "mfg" / "Ciao" / "Bis dann" / .../ "Gruss"

abschneiden, und die Zeilen danach mit regulären Ausdrücken durchackern...

oder besser zeilenweise einlesen und nur die letzten 10 zeilen oder so beachten

die mit @ ist wohl die email

die mit http oder www ist wohl die mit der url

die mit .+(str.|straße|strasse)\s [0-9]* wahrscheinlich die strasse

die mit [0-9]{5}\s.* wohl die mit dem ort

name vorname hoffentlich in der zeile davor



aber so richtig einfach ist das nicht!!
 
ja genau das ist mein Problem....

Ich denke ich werde sonst bei der Aufgabe von einer festen Formatvorlage ausgehen...dass die Signatur halt einem bestimmten Format entsprechen muss. Ansonsten sehe ich dort auch so gut wie keine Möglichkeit zuverlässig an die Daten heran zu kommen.


Schönen Dank schon mal für die Antworten....

Wenn noch jemand eine Idee hat, immer raus damit :wink:
 
Aber wie soll ich denn die regulären Ausdrücke formulieren ?

Bei der Staße + Hausnummer kan nich ja auch nicht nach .+(str.|straße|strasse)\s [0-9]* suchen, da es ja auch Straßen gibt, die halt net den Teil "Straße" oder wie auch immer in ihrem Namen haben....

Ich hab noch nicht wirklich Erfahrung mit regulären Ausdrücken....Habe für die E-Mail^^ schon sehr lange gebraucht...
 
Anonymous hat gesagt.:
Aber wie soll ich denn die regulären Ausdrücke formulieren ?

Bei der Staße + Hausnummer kan nich ja auch nicht nach .+(str.|straße|strasse)s [0-9]* suchen, da es ja auch Straßen gibt, die halt net den Teil "Straße" oder wie auch immer in ihrem Namen haben....

Ich hab noch nicht wirklich Erfahrung mit regulären Ausdrücken....Habe für die E-Mail^^ schon sehr lange gebraucht...
na ja, das braucht eben ein bissl bis man das gelernt hat; ohne übung ist da nichts zu machen!

(str.|straße|strasse|weg|hof|haus|palais|street|haufen)?

aber vorsicht, das mit dem .+ ist käse, weil dann alles "weggematcht" wird!!

nimm
? einmal oder keinmal
* beliebig oft
+ mindestens einmal, aber beliebig oft
{n,m} mindestens n mal, maximal m mal

das Problem an und für sich

"Finde einen Regex, der eine Strassenbezeichnung mit oder ohne Hausnummer zuverlässig erkennt"

ist unlösbar (wegen der blöden Wirklichkeit), du musst dich schon mit 80-90% Erkennungsquote zufriedengeben; aber davon musst du bei der gesamtaufgabe eh ausgehen
 
MarcelM hat gesagt.:
... da es ja auch Straßen gibt, die halt net den Teil "Straße" oder wie auch immer in ihrem Namen haben....

genau das ist halt das problem. es gibt keinen regulären ausdruck, der JEDE straße automatisch erkennen kann, weil straßennamen nicht nach einem standardisierten muster funktionieren. 95% der straßennamen haben zwar Str./Straße/Strasse/Allee/Weg/Gang im Namen, aber es gibt halt welche, wo es nicht so ist. und diese namen rutschen dann immer durch die grammatik.

wenn ihr über ein formularfeld auf einer internetseite arbeitet und auf sicherem wege die daten einpflegen wollt, braucht ihr entsprechende eingabefelder für name, email, adresse, firma, etc.

anders gehts halt nicht bzw. nicht so gut, dass es in 100% der fälle funktioniert.
 
Die Straße kann man auch daran erkennen, das Buchstaben Leerzeichen Zahlen und mögl. nochmal ein buchstabe kommen...

aber wie schon gesagt, ist alles andere als 100% sicher, da es keinen Standart gibt
 
So ich hab jetzt alle Ausdrücke soweit ausformuliert und die funktionieren auch unter Berücksichtigung einer bestimmten Formeinhaltung.

Ich habe nur noch keine Idee, wie ich den Firmennamen aufschlüsseln soll...

Es ist ja nicht zwangsläufig immer ein xy GmbH oder xy AG oder xy KG etc. vorhanden....

Oder steht in der Regel auch bei kleineren Betrieben bspw. eingetragener Kaufmann, e.k., etc. ?


Oder habt ihr noch eine andere Idee, wie man den Firmennamen möglichst eindeutig identifizieren kann ?
 
MarcelM hat gesagt.:
Oder habt ihr noch eine andere Idee, wie man den Firmennamen möglichst eindeutig identifizieren kann ?
behaupte mal dass das nicht geht, eben weil es keine Konvention gibt... es ist der erste eintrag das Signatur - wäre eine möglichkeit.

oder auswendiglernen. versuchen alle endungen sich zu merken und alle Endungen darauf loslassen.
 
hmm joa das ist wirklich eine sher schwammige Aufgabe...

ich habs jetzt erstmal so gelöst, dass ich nach Stichworten wie Gmbh etc. suche und den Part davor in der Zeile dazunehme und das wars... Hat zwar auch eine sehr geringe Trefferquote aber nützt ja nix...
 
würd ich auch so machen: möglichst viele Endungen

KG AG GmbH GbR

und alles was in der Zeile davor ist

Ggf. würde ich aber auch versuchen, die erste Zeile Gnadenlos zum Firmennamen zu machen

IrgendeineZeile // was kann hier schon stehen?
STRASSE ERKANNT
PLZORT ERKANNT
 
Ich habe gerade ein kleines Problem...

wenn ich nach einer Straße suche benutze ich momentan folgenden regex:

Code:
("([A-Z]{1}[a-z]*)([0-9]{1,3}\\s[A-Za-z]{1})|([A-Z]{1}[a-z]*)([0-9]{1,3}[A-Za-z]{1})|([A-Z]{1}[a-z]*)\\s([0-9]{1,3})");

Das dunktioniert auch fast....

Mein Problem ist nur, dass ich damit kein ß erkenne. Also alle Namen mit Endungen wie Straße, etc. fallen raus.. gibt es noch eine Möglichkeit das mitzunehmen ?[/quote]
 
verwende nicht A-Za-z usw. sondern lieber die vordefinierten Patterns

z.B. \w oder sowas wie

\p{Lower} A lower-case alphabetic character: [a-z]
\p{Upper} An upper-case alphabetic character:[A-Z]
\p{ASCII} All ASCII:[\x00-\x7F]
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit} A decimal digit: [0-9]
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]
\p{Print} A printable character: [\p{Graph}\x20]
\p{Blank} A space or a tab: [ \t]
\p{Cntrl} A control character: [\x00-\x1F\x7F]
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]
\p{Space}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben