В начале шаблона отрицательный взгляд на .*\.{2}
, чтобы убедиться, что в строке никогда не бывает двух .
:
(?!.*\.{2})
Также необходимо внести некоторые исправления и оптимизировать.Используя отрицательный прогноз для (одиночного) .
в начале строки, вы можете избежать необходимости повторять набор символов дважды (так как первое идентично второму, только без .
).
Один только набор отрицательных символов может соответствовать любому символу, не входящему в набор - например, ваш [^.]
прямо перед @
может соответствовать символу новой строки, который, безусловно, нене желательноВместо этого, чтобы убедиться, что последний символ перед @
не является .
, используйте другой набор символов:
^(?!.*\.{2})(?!\.)[a-z0-9_.'-]*[a-z0-9_'-]@
(в современных условиях вы можете смотреть отрицательно на .
на@
вместо этого, как и в первом методе, чтобы избежать необходимости повторять подобный набор символов, но JS lookbehind еще не везде поддерживается)
Используйте также флаг без учета регистра, чтобы избежать необходимостииспользуйте [a-zA-Z
везде.В полном объеме:
^(?!.*\.{2})(?!\.)[a-z0-9_.'-]*[a-z0-9_'-]@(?!_)(?:[a-z0-9_'-]+\.)+[a-z0-9_'-]{2,}$
https://regex101.com/r/tZ7LHt/2