Довольно хорошо!
Может быть,
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+\.[A-Za-z]+(\s|$)
или
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@([A-Za-z0-9]+|([A-Za-z0-9]+\.[A-Za-z0-9]+)*)(\s|$)
может быть немного ближе.
Если вы хотите sh, чтобы упростить / обновить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Вы можете посмотреть соответствующие шаги или изменить их в этой ссылке отладчика , если вам будет интересно. Отладчик демонстрирует, что движок RegEx может шаг за шагом потреблять некоторые входные строки образца и выполнять процесс сопоставления.
RegEx Circuit
jex.im визуализирует регулярные выражения:
Здесь мы используем квантификатор {2,6}
, который ограничивает символы после знака @
:
Мы можем заменить это на +
, как показано в демонстрации 2. Однако, возможно, это не будет хорошей идеей.
Было бы лучше, если бы вы добавили больше границ к своему выражению, если хотите проверить определенные c типы электронных писем или доменов, например, с помощью
^[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z]+\.(?:com|net|org|co)(?:\.uk)?$
В противном случае эти вышеприведенные выражения просто передадут столько строк, не относящихся к электронной почте, как действительный адрес электронной почты.