Проблемы с сопоставлением писем с регулярным выражением - PullRequest
1 голос
/ 23 апреля 2010

Я пытаюсь сопоставить адрес электронной почты, вот что я до сих пор придумал:

String text = "gandalf_storm@mymail.com"; 
String regex = "(\\w+)@{1}(\\w+){2,}\\.{1}\\w{2,4}";

Это, однако, работает в следующих случаях:

gandalf_storm@mymail.com
gandalfstorm@mymail.com
gandalf2storm@mymail.com

Таким образом, он соответствует любому буквенно-цифровому символу, повторяемому один или несколько раз, который стоит перед одним @, за которым следует любой буквенно-цифровой символ, повторяемый не менее двух раз (что является минимальным символом для любого доменного имени), за которым следует один (точка), за которым следует любой буквенно-цифровой символ. символ повторяется не менее 2 раз и не более 4 раз (поскольку существуют домены, такие как .us или .mobi).

Однако это выражение не работает с электронными письмами, такими как:

gandalf.storm@mymail.com gandalf.storm@mydomain.me.uk gandalf.storm@mysubdomain.mydomain.me.uk gandalf.storm@mysubdomain.mysubdomain.mydomain.me.uk и т. д. столько поддоменов

или

gandalf.storm@mymail.com gandalf2storm@mydomain.me.uk gandalf_storm@mysubdomain.mydomain.me.uk gandalfstorm@mysubdomain.mysubdomain.mydomain.me.uk

Я только начал изучать регулярные выражения, и мне показалось интересным попытаться решить такие проблемы с помощью регулярных выражений ... не частично, но для каждого случая любая помощь будет очень ценной. Спасибо

Ответы [ 4 ]

2 голосов
/ 23 апреля 2010

Этот вопрос задавался много, много раз, прежде чем здесь, на SO. Вот почему вы не хотите использовать регулярные выражения разобрать адреса электронной почты. Обратите внимание, что этот монстр регулярного выражения даже не обрабатывает комментарии.

0 голосов
/ 23 апреля 2010

Чтобы ответить на ваш вопрос, когда вы учитесь.

Проблема с вашим регулярным выражением, не совпадающим с первым лотом, частично связана с тем, что часть перед @ не допускает '.'персонаж.меняется на это:

 String regex = "([\\w.]+)@(\\w+){2,}\\.\\w{2,4}";

должно разрешить gandalf.storm@mymail.com, потому что [\\w.]+ говорит любой символ в группе '\ w' (любой символ) или '.'(не нужно избегать, когда часть группы, на самом деле означает точку) 1 или более раз

Это может дать вам достаточную помощь, чтобы самостоятельно разобраться с остальными.в конце концов, это и есть смысл изучения:)

Я проверил это на http://www.regexplanet.com/simple/index.html, который использует библиотеку Java для движка.

0 голосов
/ 23 апреля 2010

Регулярное выражение, которое вы используете, очень ограничено:

  • Использование класса символов \ w до @ не разрешает. символ, который объясняет, почему gandalf.storm не соответствует
  • В доменной части регулярного выражения вы допускаете только два "слова", разделенных символом. символ, исключающий «mysubdomain.mydomain.net»

Вы должны попытаться исправить это, чтобы соответствовать вашим более сложным примерам.

В качестве примечания: если вы хотите сопоставить один символ, часть {1} не является обязательной.

0 голосов
/ 23 апреля 2010

см. этот вопрос .Особенно ответ от Good Person. Эта статья содержит код для проверки адреса электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...