2010-02-12 4 views
7

자바 정규 표현식을 사용하여 문자열에서 이메일 주소를 추출하는 정규 표현식을 원합니다.자바 이메일 추출 정규식?

정말 작동합니다.

+2

이메일 주소 및 정규식 : http://stackoverflow.com/questions/201323/what- 확인을 위해 가장 적합한 정규 표현식 이메일 주소 –

+1

예. 그러나 실제로 유효성 검사가 항상 필요한 것은 아닙니다. S와^기호를 넣으면 임의의 텍스트와 함께 작동하지 않습니다. 제 질문과 답변이 다른 사람들에게도 도움이되기를 바랍니다. – EugeneP

+0

해당 스레드에 게시 된 (많은!) 패턴/응답은 IMO 이상의 정보를 제공해야합니다. –

답변

15

다음은 실제로 작동하는 정규 표현식입니다. 웹에서 서핑을하고 다른 접근 방식을 테스트하는 데 1 시간을 썼습니다. 과 Google의 최상위 순위에도 불구하고 대부분 작동하지 않았습니다.

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

여기에 원래 링크입니다 :

는 당신과 함께 작동하는 정규 표현식 공유 할 http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/

+4

죄송합니다, 이것은 적합하지 않습니다. 플러스 주소 지정 (http://en.wikipedia.org/wiki/E-mail_address#Sub-addressing)과 다른 것들 중에서 실패 할 것입니다 (예 : [email protected]m). 전자 메일 주소에 대한 올바른 정규식을 작성하는 것은 매우/어렵습니다 (불가능하지는 않지만). http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378 –

+0

또한 라틴 문자가 아닌 문자를 허용하는 ICANN의 결정에 대해서도 언급하지 않습니다. 이메일 주소 : http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/1931322#1931322 – BalusC

+1

글쎄, 네 말이 맞아, 더하기 기호는 이메일 주소의 일부가 될 수 있음을 알고 있습니다. 대괄호 사이에 쉽게 추가 할 수 있습니다. 그러나 나는 99.9 %의 사람들이 그것을 사용하지 않는다고 확신하고 있으며 대부분의 이메일 서버는 전자 메일 주소의 일부로 더하기 기호를 허용하지 않습니다. 전자 메일 유효성 검사/추출에서 어떤 정규 표현식이 실패해도 상황이 발생할 수 있다는 것에 절대적으로 동의하십시오. 이 하나는 나를 위해 일했지만 다른 사람들은 보지 못했습니다. – EugeneP

3

이클립스에 플러그인이 정규식 테스터를 설치를, 당신은 시간의 고래이있을 것이다 정규식 테스트
http://brosinski.com/regex/.

참고 사항 :
플러그인에서 문자 이스케이프에는 백 슬래시를 하나만 사용하십시오. 하지만 자바/C# 문자열로 정규 표현식을 쓸 때 두 개의 이스케이프를 수행 할 때 두 번 이스케이프 처리해야합니다. 처음에는 Java/C# 문자열 메커니즘에서 백 슬래시를 이스케이프 처리 한 다음 실제 정규식 이스케이프 메커니즘에서는 두 번째 이스케이프 처리를 수행합니다.

대괄호/타원으로 캡처 할 텍스트가있는 정규식 섹션을 둘러싸습니다. 그런 다음 Java 또는 C# 정규 표현식의 그룹 함수를 사용하여 해당 섹션의 값을 찾을 수 있습니다.

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

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

그룹 0은 항상 전체 문자열의 캡처입니다 위의 정규식, 다음 문자열

[email protected] 

수익률을 사용하여 예를 들어

, 일치.

섹션을 줄임표로 묶지 않으면 일치하는 부분 만 검색 할 수 있지만 텍스트를 캡처 할 수는 없습니다.

프로그래밍 방식으로 하나씩 테스트하고 통합해야하는 정규 표현식을 결정할 수 있으므로 하나의 긴 범용 정규식 정규식보다 몇 가지 정규식을 만드는 것이 덜 혼동 스러울 수 있습니다. 특히 전에 결코 생각해 보지 못한 새로운 이메일 패턴을 발견했을 때.

+0

@ h2g2java 나 자신에 관해서는 이미 비슷한 플러그인을 사용하고 있습니다. 그리고 나는 당신의 대답을 매우 고맙게 생각합니다. 사물들도 정규 표현식으로 작업하는 그러한 도구가 악몽 일 수 있다는 것을 알았습니다. 귀하의 답변은 많은 사람들이 시간을 절약하는 데 도움이 될 것이라고 확신합니다. – EugeneP

4

나는 그들을 허용하기 위해 몇 가지 대시를 추가해야했습니다. 그래서 자바에서 최종 결과 :

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

조금 늦었지만 괜찮습니다.

내가 사용하는 것입니다. FireBug의 콘솔에 붙여 넣기 만하면됩니다. 웹 페이지에서 'Textarea'(페이지 하단에 있음)를 찾으십시오.이 태그에는 A 태그에서 발견 된 모든 이메일 주소의 분리 된 목록이 포함됩니다.

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

자바의 이메일 주소 빌드 - 패턴 (Patterns.EMAIL_ADDRESS)이 완벽하게 작동합니다 :

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; 
    }