String auf E-Mail kürzen

friednoodles

Aktives Mitglied
Ich habe einen String der wie folgt aufgebaut ist:

vornamenachname_vorname.nachname_standort_sprache_firma_vorname.nachname@firma.de_standard.htm

in einem realen Beispiel könnte der so aussehen:

mmustermann_max.mustermann_Berlin_DE_Bosch_max.mustermann@bosch.de_STANDARD.htm

Hier versuche ich vergeblich die E-Mail Adresse zu extrahieren.
Was ich bisher versucht habe gibt mir entweder "_STANDARD" oder einen leeren String zurück.

Java:
int lastIndexOfUnderscore = Signaturename.lastIndexOf('_');
                    int secondLastIndexOfUnderscore = Signaturename.lastIndexOf('_', lastIndexOfUnderscore);
                    userMail = Signaturename.substring(secondLastIndexOfUnderscore, lastIndexOfUnderscore);

Der zweite int Wert bereitet mir hier ein wenig Kopfschmerzen da mir nicht ganz klar ist welche Methode hier am besten zum Einsatz kommen sollte.
 
Ich würde es so machen :
Java:
public static String extraktEmail(String input) {
        String[] parts = input.split("_");
        return parts[parts.length-2];
    }
 
bin gerade auch mit regex beschäftigt,dass sollte ein regex für e-mail sein:
Code:
Static Pattern p = Pattern.compile( "[\\w|-]+@\\w[\\w|-]*\\.[a-z]{2,3}" );
 
Ich würde das einfach mit einem regulären Ausdruck lösen. Generell habe ich da gewisse Bauschmerzen da ja in den Werten prinzipiell auch Unterstriche vorkommen können, aber hoffen wir mal, dass die Namen generell ohne Unterstrich daher kommen und wenn dann nur die Email-Adresse einen Unterstrich hat.
[^_] steht für beliebige Zeichen außer einem '_'
[^_]+bzw [^_]* stehen dann für die jeweiligen Blöcke.
_ steht für den '_'
Die Email ist dann halt irgend ein Rest also .*
Eine Capturing Gruppe sind einfache Klammern.
Anfang der Zeile: ^
Ende der Zeile: $
Also hast Du da dann einfach ^[^_]+_[^_]+_[^_]+_[^_]+_[^_]+_(.*)_[^_]+$

Auf https://regex101.com/ kannst Du zum einen selbst testen und dir auch fertigen Java Code zeigen lassen, der den Test macht.

Edit: Natürlich kannst Du für die einzelnen Felder auch Gruppen machen und diese benennen. Dann läuft es auf etwas wie dem hier hinaus:
^(?<name1>[^_]+)_(?<name2>[^_]+)_(?<Ort>[^_]+)_(?<Sprache>[^_]+)_(?<firma>[^_]+)_(?<email>.*)_(?<rest>[^_]+)$
 
Zuletzt bearbeitet von einem Moderator:
hier wäre das ganze mit regex gelöst, keine ahnung ob das deiner vorstellung entspricht?

Code:
import java.util.regex.Matcher;

import java.util.regex.Pattern;



public class Test{

    public static void main(String[] args) {



        //Zwischenspeicher für Informationen

        String email = new String();



        //Vorgegebener Text

        String text = "vornamenachname_vorname.nachname_standort_sprache_firma_vorname.nachname@firma.de_standard.htm";



        //Suchmuster als String speichern

        String suchMuster = ".+_.+_.+_.+_.+_(?<mail>.+@.+)_";



        //Suchmuster in Regex umwandeln

        Pattern regex = Pattern.compile(suchMuster);



        //Matcher Objekt erstellen

        Matcher m = regex.matcher(text);



        //find

        while(m.find()) {

            email = m.group("mail");

        }



        //Ausgabe in der Konsole

        System.out.println(email);



    }

}

das suchMuster könntest du alternativ auch so schreiben: String suchMuster = "_(?<mail>.+@.+)_"
 
Wenn Du eher eine Lösung mit Basiswerkzeugen bevorzugst, kannst Du einfach einen Zwischenschritt einbauen: Mach den String bis zum ersten Underscore zu einer eignen Variablen und hol Dir dann mit lastIndex() den vorletzen (in diesem Fall letzten Underscore vom neuen Substring)

Java:
public class ExtractMail {

    public static String signaturenName = "mmustermann_max.mustermann_Berlin_DE_Bosch_max.mustermann@bosch.de_STANDARD.htm";

    public static void main(String[] args) {

        int lastIndexOfUnderscore = signaturenName.lastIndexOf('_');

        String stringTillLastUnderscore = signaturenName.substring(0, lastIndexOfUnderscore);

        int lastIndexOfSubstring = stringTillLastUnderscore.lastIndexOf('_');

        String userMail = signaturenName.substring(lastIndexOfSubstring + 1, lastIndexOfUnderscore);

        System.out.println("Mail: " + userMail);
    }

}
 

Neue Themen


Zurück
Oben