2016-09-09 3 views
-1

Я ищу grep команду, чтобы проверить имена, как: -Использование Grep для проверки имен пользователей

mi.ma 
ab-bc 
ab.bc-ad 
ab_de 
mima 

Не допускается должно быть:

..mima 
mima.. 
mia--bc 
mia---ad 
ab___de 
__ab 
ab__ 

Разрешено должно быть a-z, 0-9, -, ., _, но не двойной -, ., _, и это также не спереди или сзади. И это должно быть мин. имеют 3 символа.

ответ

2

Здесь:

^[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, чтобы соответствовать точной строке, и, следовательно, избавиться от ^ и $ якоря.то у вас есть два варианта, чтобы сделать эту работу:

  1. Используйте приведенный выше код с grep -P, или, что эквивалентно pcregrep, так как стандартный grep инструмент не поддерживает lookaheads:

    pcregrep -x "(?=.{3,})[a-z0-9]+([._-]?[a-z0-9]+)*" <filename> 
    
  2. Использование grep -E, или эквивалентно egrep, для специальной поддержки символов; трубы выход через второй grep, чтобы удовлетворить «мин 3 символы» условие:

    egrep -x "[a-z0-9]+([._-]?[a-z0-9]+)*" <filename> | grep ... 
    
0

@TomLord ответ является правильным.

Я indipendently пришел к точно такой же ответ (в минуту позже :-(), но для PHP (так как вы добавили php тег ...), так что я пишу, тоже ...:

preg_match('/^[a-z0-9]+(?:[._-]?[a-z0-9]+)*$/', $name); 
Смежные вопросы