2010-02-12 6 views
7

Ich möchte einen regulären Ausdruck, der E-Mail-Adressen aus einem String extrahiert (mit regulären Ausdrücken von Java).Java E-Mail Extraktion regulären Ausdruck?

Das funktioniert wirklich.

+2

E-Mail-Adressen und regex: http://stackoverflow.com/questions/201323/what- ist-der-beste-reguläre-ausdruck-für-validieren-email-adressen –

+1

Ja. Aber Validierung ist nicht immer das, was wir brauchen. Wenn Sie die Symbole S und^setzen, funktioniert es nicht mit einem beliebigen Text. Ich hoffe, dass meine Frage und Antwort auch für andere nützlich sein wird. – EugeneP

+0

Die (vielen!) Muster/Antworten, die in diesem Thread gepostet werden, sollten Ihnen mehr als genug Informationen IMO liefern. –

Antwort

15

Hier ist der reguläre Ausdruck, der wirklich funktioniert. Ich habe eine Stunde lang im Internet surfen und verschiedene Ansätze getestet, und die meisten von ihnen funktionierten nicht, obwohl Google diese Seiten am besten bewertete.

Ich möchte mit Ihnen einen funktionierenden regulären Ausdruck teilen:

 
[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,}) 

Hier ist das Original-Link: http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/

+4

Sorry, das stimmt nicht. Es wird unter anderem für Plus-Adressierung (http://en.wikipedia.org/wiki/E-mail_address#Sub-addressing) fehlschlagen (ein Beispiel ist [email protected]). Einen korrekten regulären Ausdruck für E-Mail-Adressen zu schreiben ist/sehr/schwer (wenn nicht unmöglich). Siehe auch http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378 –

+0

Und nicht über ICANNs Entscheidung, nicht-lateinische Zeichen zuzulassen in E-Mail-Adressen: http://StackOverflow.com/Questions/201323/what-ist-the-best-regular-Expression-for-Validating-Email-Adressen/1931322#1931322 – BalusC

+1

Nun, du hast Recht, ich habe nicht Ich weiß, dass ein Pluszeichen Teil einer beliebigen E-Mail-Adresse sein kann. Ich kann leicht zwischen eckigen Klammern hinzugefügt werden. Aber ich bin mir ziemlich sicher, dass 99,9% der Leute es nicht verwenden, und die meisten E-Mail-Server erlauben kein Pluszeichen als Teil der E-Mail-Adresse. Stimme absolut zu, dass es Situationen geben kann, in denen es egal ist, welcher reguläre Ausdruck bei der E-Mail-Validierung/Extraktion fehlschlägt. Obwohl dieser für mich arbeitete und ich andere gesehen habe, die das nicht taten. – EugeneP

3

diese Regex Tester in Eclipse-Plugin installieren, und man müsste Wal einer Zeit Test Regex
http://brosinski.com/regex/.

Punkte zu beachten:
Verwenden Sie im Plugin nur einen Backslash für die Zeichenflucht. Aber wenn Sie die Regex in eine Java/C# -Zeichenfolge transkribieren, müssten Sie sie verdoppeln, da Sie zwei Escapes durchführen würden, zuerst den Backslash vom Java/C# -String-Mechanismus und dann zweitens für den eigentlichen Regex-Zeichen-Escapemechanismus.

Umgeben Sie die Abschnitte der Regex, deren Text Sie mit runden Klammern/Ellipsen erfassen möchten. Dann könnten Sie die Gruppenfunktionen in Java oder C# regex verwenden, um die Werte dieser Abschnitte zu ermitteln.

([_A-Za-z0-9 -] +) (\. [_A-Za-z0-9 -] +) @ ([A-Za-z0-9] +) (\. [ A-Za-Z0-9] +)

Um zum Beispiel der oben regex verwenden, die folgenden Zeichenfolge

[email protected] 

Ausbeuten

start=0, end=16 
Group(0) = [email protected] 
Group(1) = abc 
Group(2) = .efg 
Group(3) = asdf 
Group(4) = .cde 

Gruppe 0 ist immer die Erfassung des gesamten String abgestimmt.

Wenn Sie keinen Abschnitt mit Ellipsen umschließen, können Sie nur eine Übereinstimmung erkennen, den Text jedoch nicht erfassen.

Es könnte weniger verwirrend sein, ein paar Regex als einen langen Catch-All-Regex zu erstellen, da Sie nacheinander einen Programmtest durchführen und dann entscheiden könnten, welche Regexes konsolidiert werden sollen. Vor allem, wenn Sie ein neues E-Mail-Muster finden, das Sie nie zuvor in Betracht gezogen hatten.

+0

@ h2g2java Wenn ich über mich selbst spreche, benutze ich bereits ein ähnliches Plugin. Und ich schätze Ihre Antwort sehr, denn ich finde auch, dass ohne solche Tools die Arbeit mit regulären Ausdrücken ein Albtraum sein kann. Ich bin sicher, deine Antwort wird vielen Menschen helfen, ihre Zeit zu sparen. – EugeneP

4

Ich musste einige Bindestriche hinzufügen, um sie zu ermöglichen. Also ein Endergebnis in Javanisch:

final String MAIL_REGEX = "([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})"; 
0

ein wenig spät, aber ok.

Hier ist was ich benutze. Fügen Sie es einfach in die Konsole von FireBug ein und führen Sie es aus. Suchen Sie auf der Webseite nach einem 'Textarea' (am wahrscheinlichsten am Ende der Seite), das eine separate Liste aller E-Mail-Adressen enthält, die in A-Tags gefunden wurden.

var jquery = document.createElement('script'); 
    jquery.setAttribute('src', 'http://code.jquery.com/jquery-1.10.1.min.js'); 
    document.body.appendChild(jquery); 

    var list = document.createElement('textarea'); 
    list.setAttribute('emaillist'); 
    document.body.appendChild(list); 
var lijst = ""; 

    $("#emaillist").val(""); 
    $("a").each(function(idx,el){ 
     var mail = $(el).filter('[href*="@"]').attr("href"); 
     if(mail){ 
      lijst += mail.replace("mailto:", "")+","; 
     } 
    }); 
    $("#emaillist").val(lijst); 
0

Die Java ‚s build-in E-Mail-Adresse Muster (Patterns.EMAIL_ADDRESS) funktioniert perfekt:

public static List<String> getEmails(@NonNull String input) { 
     List<String> emails = new ArrayList<>(); 
     Matcher matcher = Patterns.EMAIL_ADDRESS.matcher(input); 
     while (matcher.find()) { 
      int matchStart = matcher.start(0); 
      int matchEnd = matcher.end(0); 
      emails.add(input.substring(matchStart, matchEnd)); 
     } 
     return emails; 
    }