Похоже, вы на самом деле не знакомы с тем, что делает ваше регулярное выражение в настоящее время, что было бы хорошим первым шагом перед его изменением.Давайте пройдемся по вашему регулярному выражению, используя адрес электронной почты john.robert.smith@mail.com
(в каждом разделе ниже выделенная жирным шрифтом часть соответствует этому разделу):
^
- это начало привязки строки .Он указывает, что любое совпадение должно начинаться с начала строки.Если шаблон не привязан, механизм регулярных выражений может соответствовать подстроке, что часто нежелательно.
Якоря имеют нулевую ширину, что означает, что они не захватывают никаких символов.
[_a-z0-9-]+
состоит из двух элементов: класс символов и модификатор повторения :
[...]
определяет класс символов,который сообщает движку регулярных выражений, любой из этих символов является действительным совпадением .В этом случае класс содержит символы az, цифры 0-9 и тире и подчеркивание (обычно тире в классе символов определяет диапазон, поэтому вы можете использовать a-z
вместо abcdefghijklmnopqrstuvwxyz
; если задано какпоследний символ в классе, он действует как буквальный тире). +
- модификатор повторения, который указывает, что предыдущий токен (в данном случае, класс символов) может повторяться один или несколько раз.Есть два других оператора повторения: *
соответствует нулю или более раз;?
соответствует ровно нулю или одному разу (т. Е. Делает что-то необязательно ).
(захватывает john.robert.smith@mail.com)
(\.[_a-z0-9-]+)*
снова содержит класс повторяющихся символов.Он также содержит группу и экранированный символ:
(...)
определяет группу, которая позволяет группировать несколько токенов вместе (в этом случае группа будетповторяется в целом).
Допустим, мы хотели сопоставить 'abc', ноль или более раз (т. е. abcabcabc соответствует, abcccc нет).Если мы попытаемся использовать шаблон abc*
, модификатор повторения будет применяться только к c
, потому что c - это последний токен перед модификатором.Чтобы обойти это, мы можем сгруппировать abc ((abc)*
), в этом случае модификатор будет применяться ко всей группе, как если бы это был один токен. \.
указывает буквальную точкуперсонаж.Причина, по которой это необходимо, заключается в том, что .
- это специальный символ в регулярном выражении, означающий любой символ .Поскольку мы хотим сопоставить действительный символ точки, нам нужно его избежать.
(захватывает john.robert.smith@mail.com)
@
не является специальным символом в регулярном выражении, поэтому, как и все другие не специальные символы, он соответствует буквально.
(захватывает john.robert.smith @ mail.com)
[a-z0-9-]+
снова определяет класс повторяющихся символов, как пункт № 2 выше.
(захватывает john.robert.smith@mail.com)
(\.[a-z0-9-]+)*
- это почти тот же шаблон, что и № 3 выше.
(захватывает john.robert.smith@mail.com)
$
- конец привязки строки.Он работает так же, как ^
выше, за исключением совпадений с концом строки.
Учитывая это, должно быть немного яснее, как добавить раздел сзахватывает сегмент плюс.Как мы видели выше, +
- это специальный символ, поэтому его необходимо экранировать.Затем, поскольку за + должны следовать некоторые символы, мы можем определить класс символов с символами, которым мы хотим соответствовать, и определить его повторение.Наконец, мы должны сделать всю группу необязательной, потому что адреса электронной почты не должны иметь + сегмент:
(\+[a-z0-9-]+)?
При вставке в регулярное выражение это будет выглядеть так:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$/i