Как удалить точку (.), Используя регулярное выражение для адресов электронной почты типа "abcd.efgh@xyz.com" в Java? - PullRequest
0 голосов
/ 27 марта 2012

Я пытался написать регулярное выражение для определения адресов электронной почты типа 'abc@xyz.com' в Java.Я придумал простой шаблон.

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

Однако он также обнаружит адреса электронной почты типа 'abcd.efgh@xyz.com'.Я просмотрел http://www.regular -expressions.info / и ссылки на этом сайте, например

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

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

Поэтому я изменил свой шаблон на следующий, чтобы избежать обнаружения'efgh@xyz.com'

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

Если в строке 'String' содержится адрес 'abcd.efgh@xyz.com', мой почтовый идентификатор String вернется с 'fgh@yyz.com'.Почему это происходит?Как написать регулярное выражение для обнаружения только «abc@xyz.com», а не «abcd.efgh@xyz.com» ?

Кроме того, как написать одно регулярное выражение для обнаружения адресов электронной почты, например «abc @»xyz.com 'и' efg at xyz.com 'и' abc (at) xyz (dot) com 'из строк.В основном, как я мог бы реализовать логику OR в регулярном выражении для выполнения чего-то вроде проверки на @ OR в OR (at)?

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

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

для abcd.efgh@xyz.com

abc
null
null
abc
xyz

для abc@xyz.com

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

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

[^\\.\W]+

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

Итак, у вас есть:

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

Чтобы ответить на второй вопрос, вы можете использовать OR в REGEX с помощью |символ

(@|at)
0 голосов
/ 27 марта 2012

Вы можете использовать | оператор в ваших регулярных выражениях для обнаружения @ORAT: @ | OR | (at).
Вы можете избежать появления точки в адресах электронной почты, используя ^ в начале шаблона:
Попробуйте это:
<pre> 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); }

...