Здесь:
^[a-z0-9]+(?:[._-]?[a-z0-9]+)*$
Demo
Объяснение:
- Первый
[a-z0-9]+
обеспечивает имя пользователя начинается с (строчные) буквы или цифры.
[._-]?
позволяет наличие одного (или ни одного) "."
, "_"
или "-"
характер.
- Окончательный
[a-z0-9]+
обеспечивает имя пользователя ENDS с буквой или номером (в нижнем регистре).
- Объединение этой второй группы в
(...)*
допускает множественные "."
, "_"
или "-"
символов в середине имени пользователя (при условии, что они разделены буквами/цифрами), например. "ab.bc-ad"
.
Edit:
Я просто заметил, окончательное условие соответствия:
И это должно мин. имеют 3 символа.
Самый простой способ добавить это как часть регулярного выражения является с опережающего просмотра - т.е .:
^(?=.{3,})[a-z0-9]+(?:[._-]?[a-z0-9]+)*$
Вот updated demo с дополнительными тестовыми строками.
Edit2:
выше совершенно справедливо для PHP
. Однако, в случае, если кто читает это на самом деле ищет ответ не используя grep
(то есть ничего общего с PHP
...)
Прежде всего заметим, что вы можете использовать модификатор -x
, чтобы соответствовать точной строке, и, следовательно, избавиться от ^
и $
якоря.то у вас есть два варианта, чтобы сделать эту работу:
Используйте приведенный выше код с grep -P
, или, что эквивалентно pcregrep
, так как стандартный grep
инструмент не поддерживает lookaheads:
pcregrep -x "(?=.{3,})[a-z0-9]+([._-]?[a-z0-9]+)*" <filename>
Использование grep -E
, или эквивалентно egrep
, для специальной поддержки символов; трубы выход через второй grep
, чтобы удовлетворить «мин 3 символы» условие:
egrep -x "[a-z0-9]+([._-]?[a-z0-9]+)*" <filename> | grep ...