2013-04-17 9 views
11

Moim zamiarem jest uzyskanie adresu e-mail ze strony internetowej. Mam źródło strony. Czytam wiersz źródła strony po linii. Teraz chcę uzyskać adres e-mail z bieżącego wiersza, który czytam. Ta bieżąca linia może lub nie może zawierać wiadomości e-mail. Widziałem wiele przykładów regexp. Ale większość z nich służy do sprawdzania poprawności adresu e-mail. Chcę, aby adres e-mail ze źródła strony nie był sprawdzany. Powinien działać jako http://emailx.discoveryvip.com/ pracujeWykonywanie wyrażeń regularnych w celu wyszukania adresu e-mail z ciągu znaków

Niektóre linie wejściowe przykładami są:

1)<p>Send details to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%72%65%62%65%6b%61%[email protected]%68%61%63%6b%73%75%72%66%65%72.%63%6f%6d">[email protected]</a></p> 

2)<p>Interested should send details directly to <a href="http://www.abcdef.com/abcdef/">www.abcdef.com/abcdef/</a>. Should you have any questions, please email <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6a%6f%62%[email protected]%72%65%6c%61%79.%65%64%75">[email protected]</a>. 

3)Note :- Send your queries at [email protected] for more details call Mr. neeraj. 

Chcę dostać [email protected] z przykładów 1,2 i 3. używam java i nie jestem dobry w rexexp. Pomóż mi.

+1

Czy sprawdzić, co Google mówi o „java regex Wyślij”? – Vitaly

+0

sprawdź źródło strony http://emailx.discoveryvip.com/. Podali metodę wyodrębniania e-maili. Ale chcę wersji java – Neeraj

+2

Co próbowałeś? Stack Overflow to strona z pytaniami i odpowiedziami, a nie strona "do dzieła dla mnie". Pokaż nam, co masz, aby pomóc Ci w rozwiązaniu konkretnego problemu. –

Odpowiedz

10

można potwierdzić e-mail formatów adresowych jak według RFC 2822, z tego:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

i oto wyjaśnienie z regular-expressions.info:

Ten regex ma dwie części: część przed znakiem @ i część po znaku @. Istnieją dwie alternatywy dla części przed znakiem @: może ona składać się z szeregu liter, cyfr i pewnych symboli, w tym jednej lub więcej kropek. Kropki nie mogą jednak pojawiać się kolejno ani na początku ani na końcu adresu e-mail. Druga alternatywa wymaga, aby część przed @ była ujęta w podwójne cudzysłowy, umożliwiając dowolny ciąg znaków ASCII między cytatami. Białe znaki, podwójne cudzysłowy i ukośniki odwrotne muszą być poprzedzone ukośnikami odwrotnymi.

Możesz to sprawdzić tutaj: Rubular example.

+0

Dziękuję bardzo NomNomBot. Próbuję z twoim wyrażeniem regularnym. – Neeraj

+0

Upewnij się, że udało Ci się uciec przed ukośnikiem, ukośnikiem itp. –

+0

Tak. Gotowe. I działa poprawnie. Dzięki. – Neeraj

2

Trzeba coś takiego regex:

".*(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b).*" 

Kiedy pasuje, można wyodrębnić pierwszą grupę i to będzie Twój e-mail.

String regex = ".*(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b).*"; 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher("your text here"); 
if (m.matches()) { 
    String email = m.group(1); 
    //do somethinfg with your email 
} 
+0

Istnieje wiele wiadomości e-mail w tekście – Vitaly

+0

Jak uzyskać tylko pierwszy dopasowany tekst – Stunner

+0

@Petar Ivanov To nie działa dla mnie. –

13

Poprawny kod jest

Pattern p = Pattern.compile("\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b", 
    Pattern.CASE_INSENSITIVE); 
Matcher matcher = p.matcher(input); 
Set<String> emails = new HashSet<String>(); 
while(matcher.find()) { 
    emails.add(matcher.group()); 
} 

To daje listę adresów poczty elektronicznej w długi text/html wejściowych.

+1

Nie uwzględnia to nazw domen, które mają więcej niż dwie części, na przykład w Wielkiej Brytanii masz adresy takie jak coś@firma.pl. W dzisiejszych czasach masz kilka nowych TLD, które są dłuższe niż 4 znaki. –

1

Jest to prosty sposób, aby wyodrębnić wszystkie e-maile z łańcucha wejściowego używając 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; 
    } 
Powiązane problemy