Регулярное выражение, которое соответствует шаблону или является пустой строкой


85

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

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

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

Исходя из моих ограниченных знаний о регулярных выражениях, я думаю, что \bсоответствует пустой строке и |означает «Или», поэтому я попытался сделать следующее, но это не сработало:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b

5
Если вам необходимо подтвердить электронную почту, будьте максимально снисходительны. Вы будете удивлены, насколько легко пропустить настоящие, действительные и функциональные адреса электронной почты с домашними регулярными выражениями. Например, ваше регулярное выражение не будет работать на этих действительных адресах: joe_blow@foo.com, micro$oft@apple.com, root @ localhost, siegfried+roy@lasvegas.com.
Zano

Согласившись с Зано, просто взгляните на это регулярное выражение ex-parrot.com/pdw/Mail-RFC822-Address.html
Андерс,

@Anders вау, это очень сложное регулярное выражение! Я думаю, что неправильно оценил сложность регулярного выражения
Курт

5
Нет, я думаю, вы неправильно оценили сложность проверки электронной почты :-)
Зано,

Ответы:


201

Чтобы сопоставить patternили пустую строку, используйте

^$|pattern

Объяснение

  • ^и $являются началом и концом якорей строки соответственно.
  • |используется для обозначения альтернатив, например this|that.

Рекомендации


На \b

\bв большинстве случаев это привязка "границы слова". Это совпадение нулевой ширины, то есть пустая строка, но оно сопоставляет эти строки только в очень определенных местах , а именно на границах слова.

То \bесть находится:

  • Между последовательными \wи \W(в любом порядке):
    • т.е. между символом слова и символом, не являющимся словом
  • Между ^и\w
    • т.е. в начале строки, если она начинается с \w
  • Между \wи$
    • т.е. в конце строки, если она заканчивается на \w

Рекомендации


При использовании регулярного выражения для сопоставления адресов электронной почты

Это не тривиально, в зависимости от спецификации.

Связанные вопросы


10

Альтернативой было бы поместить ваше регулярное выражение в круглые скобки без захвата. Затем сделайте это выражение необязательным с помощью ?квалификатора, который будет искать 0 (то есть пустую строку) или 1 экземпляры незахваченной группы.

Например:

/(?: some regexp )?/

В вашем случае регулярное выражение будет выглядеть примерно так:

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

Нет |«или» оператор надо!

Вот документация Mozilla по синтаксису регулярных выражений JavaScript.


8

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

^$|^[^@\s]+@[^@\s]+$

имея в виду

^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

Вы все равно не остановите поддельные электронные письма, и таким образом не остановите действительные адреса.


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

1
У меня также есть клиенты, которые часто просят об этом. На самом деле это просто для того, чтобы клиенты не делали глупостей, например, вводили свой номер телефона в поле электронной почты.
Келли Гендрон

Просто хотел проверить пустую строку. ^ $ Работал
Subhashi

1

\ b соответствует границе слова. Я думаю, вы можете использовать ^ $ для пустой строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.