Как удалить символ точки (.) с помощью регулярного выражения для адресов электронной почты типа [email protected] в java?

Я пытался написать регулярное выражение для обнаружения адресов электронной почты типа «[email protected]» в java. Я придумал простую схему.

String line = // my line containing email address
Pattern myPattern = Pattern.compile("()(\\w+)( *)@( *)(\\w+)\\.com");
Matcher myMatcher = myPattern.matcher(line);

Однако это также обнаружит адреса электронной почты типа «[email protected]». Я просмотрел http://www.regular-expressions.info/ и ссылки на этом сайте, такие как

Как сопоставлять только строки, не содержащие точки (с использованием регулярных выражений)

метасимвол Java RegEx (.) и обычная точка?

Поэтому я изменил свой шаблон на следующий, чтобы избежать обнаружения «[email protected]».

Pattern myPattern = Pattern.compile("([^\\.])(\\w+)( *)@( *)(\\w+)\\.com");
Matcher myMatcher = myPattern.matcher(line);
String mailid = myMatcher.group(2) + "@" + myMatcher.group(5) + ".com";

Если String 'line' содержит адрес '[email protected]', мой String mailid вернется с '[email protected]'. Почему это происходит? Как написать регулярное выражение для обнаружения только «[email protected]», а не «[email protected]»?

Кроме того, как написать одно регулярное выражение для обнаружения адресов электронной почты, таких как «[email protected]» и «efg at xyz.com» и «abc (at) xyz (точка) com» из строк. В принципе, как бы я реализовал логику ИЛИ в регулярном выражении для выполнения чего-то вроде проверки @ ИЛИ в ИЛИ (в)?

После некоторых комментариев ниже я попробовал следующее выражение, чтобы получить часть до квадрата @.

Pattern.compile("((([\\w]+\\.)+[\\w]+)|([\\w]+))@(\\w+)\\.com")
Matcher myMatcher = myPattern.matcher(line);

что будет myMatcher.groups? как рассматриваются эти группы, когда у нас есть вложенные скобки?

System.out.println(myMatcher.group(1));
System.out.println(myMatcher.group(2));
System.out.println(myMatcher.group(3));
System.out.println(myMatcher.group(4));
System.out.println(myMatcher.group(5));

вывод был такой

abcd.efgh
abcd.efgh
abcd.
null
xyz

для [email protected]

abc
null
null
abc
xyz

для [email protected]

Спасибо.


person Chinmay Nerurkar    schedule 27.03.2012    source источник
comment
Почему вы разрешаете пробелы до и после @? Это недействительно в адресах электронной почты.   -  person Jim Garrison    schedule 27.03.2012
comment
Почему вы хотите обнаруживать адреса электронной почты, написанные в формате me (at) example (dot) com? Если кто-то пишет это, он изо всех сил старается избежать его анализа машиной.   -  person Andrew Morton    schedule 27.03.2012
comment
@Jim Я оставил пустые поля, чтобы обнаружить адреса электронной почты, написанные как «abc @ xyz.com», написанные так, чтобы их было нелегко добывать.   -  person Chinmay Nerurkar    schedule 27.03.2012
comment
@ Эндрю - я пытаюсь написать что-нибудь для чтения этих адресов в рамках курса, который я прошел. Как ни подозрительно это выглядит, я работаю с локальными html-файлами, предоставленными университетом, а не добываю данные в Интернете.   -  person Chinmay Nerurkar    schedule 27.03.2012


Ответы (2)


Вы можете использовать | оператор в ваших регулярных выражениях для обнаружения @ORAT: @|OR|(at).
Вы можете избежать использования точки в адресах электронной почты, используя ^ в начале шаблона:
Попробуйте следующее:

    Pattern myPattern = Pattern.compile("^(\\w+)\\s*(@|at|\\(at\\))\\s*(\\w+)\\.(\\w+)");
    Matcher myMatcher = myPattern.matcher(line);
    if (myMatcher.matches())
    {
        String mail = myMatcher.group(1) + "@" + myMatcher.group(3) + "." +myMatcher.group(4);
        System.out.println(mail);
    }

person dexametason    schedule 27.03.2012
comment
Вы также можете догадаться, как изменить шаблон, чтобы он соответствовал *** dot com :) - person dexametason; 27.03.2012
comment
Шаблон не соответствует ни одному из почтовых адресов. Наверное из-за ^? После удаления ^ он соответствовал множеству других подстрок, таких как [email protected]. - person Chinmay Nerurkar; 27.03.2012

Ваш первый шаблон должен сочетать в себе факты, которые вы хотите использовать в качестве символа слова, а не точки, в настоящее время он у вас есть отдельно, он должен быть:

[^\\.\W]+

Это «не точки» и «не небуквенные символы»

Так что у тебя есть:

Pattern myPattern = Pattern.compile("([^\\.\W]+)( *)@( *)(\\w+)\\.com");

Чтобы ответить на ваш второй вопрос, вы можете использовать ИЛИ в REGEX с | персонаж

(@|at)
person Ina    schedule 27.03.2012
comment
как здесь работает «не не рабочая часть»? [^\\.\W]+ не будет компилироваться, пока я не изменю его на [^\\.\\W]+, и это, кажется, работает, чтобы свести на нет слово 'abc' из [email protected] и возвращает только @ xyz.com - person Chinmay Nerurkar; 27.03.2012