Проверка адреса электронной почты с односимвольными доменными именами с регулярным выражением - PullRequest
1 голос
/ 06 января 2010

У меня есть регулярное выражение, которое я использую для проверки адресов электронной почты. Мне нравится это регулярное выражение, потому что оно довольно расслабляющее и доказало свою эффективность.

Вот регулярное выражение:

(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@[^\.][\w\.\-]+\.[A-Za-z]{2,}>?

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

Теперь случается, что joe@x.com не проверяет. И угадайте, что x.com на самом деле является доменным именем, которое существует (принадлежит paypall).

Просмотр части регулярного выражения, которая проверяет доменное имя:

@[^\.][\w\.\-]+

Похоже, это должно быть в состоянии проанализировать доменное имя x.com , но это не так. Виновником является часть, которая проверяет, что доменное имя не может начинаться с точки (например, test @ .test.com)

@[^\.]

Если я удаляю часть [^.] Моего регулярного выражения, домен x.com проверяет, но теперь регулярное выражение разрешает имена доменов, начинающиеся с точки, например .test.com; это немного слишком расслабься для меня; -)

Таким образом, мой вопрос заключается в том, как часть списка отрицательных символов может повлиять на мою проверку одного символа, в основном то, как я читаю регулярное выражение: «убедитесь, что эта строка не начинается с точки», но, очевидно, она делает больше.

Буду признателен за любую помощь.

С уважением,

Waseem

Ответы [ 5 ]

5 голосов
/ 06 января 2010

Как предположил Луис, вы можете использовать [^\.][\w\.\-]* для соответствия имени домина, однако теперь оно будет также соответствовать адресам, таким как john@x.....com и john@@.com. Возможно, вы захотите убедиться, что за один раз существует только один период, и что первый символ после @ более ограничен, чем просто не является периодом.

Сопоставьте имя домена и период (и субдомены и их периоды), используя:

([\w\-]+\.)+

Итак, ваш шаблон будет:

(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@([\w\-]+\.)+[A-Za-z]{2,}>?
3 голосов
/ 06 января 2010

Измените квантификатор +, означающий один или несколько, на *, означающий ноль или более.

3 голосов
/ 06 января 2010

Если вы измените [^\.][\w\.\-]+ на [^\.][\w\.\-]*, все будет работать так, как вы ожидаете!

Причина: [^\.] будет соответствовать одному символу, который не является точкой (в вашем случае, "x" на "x.com", затем вы попытаетесь набрать 1 или более символов, а затем точка. Вы будете сопоставлять точку после x, и больше нет точек для сопоставления. Символ * будет соответствовать 0 или более символам после первого, что вам и нужно.

0 голосов
/ 06 января 2010

Посмотрите на более широкий контекст в вашем шаблоне:

@[^\.][\w\.\-]+\.[A-Za-z]{2,}

Так что для joe@x.com,

  • [^.] совпадений x
  • [\w.-]+ совпадений .
  • \. нужна точка, но находит c

Измените эту часть на @[^.][\w-]*\.[A-Za-z]{2,}

0 голосов
/ 06 января 2010

Изменить @[^\.][\w\.\-]+ на @[^\.][\w\.\-]* Причина, по которой вам это нужно, заключается в том, что [^\.] говорит, что соответствует одному символу, который не является точкой. Теперь больше не осталось символов, поэтому [\w\.\-]+ не имеет ничего, чтобы соответствовать, хотя знак плюс требует минимум один символ. Изменение плюса на звезду исправляет это.

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