Написание регулярного выражения для фильтрации введенного имени пользователя - PullRequest
5 голосов
/ 08 апреля 2019

Я хочу написать регулярное выражение, которое будет фильтровать любое имя пользователя, которое:

  • Начинается с цифры или буквы (без учета регистра)
  • Может включать -, но не может содержать более одного подряд

    пример u-s-e-rus-erus--er

  • Также имя пользователя не может начинаться с - или заканчиваться -

    пример -useruser-

  • Это также должно бытьпо крайней мере 1 символ ( буква или цифра ) и максимум 39.

Ближайший результат, к которому я пришел, примерно такой:

^[a-zA-Z\d](?:[a-zA-Z\d]|-(?=[a-zA-Z\d])){0,38}

Это точно соответствует тому, что должно соответствовать, но также соответствует некоторым вещам, которые не должны.

В основном эти не должны быть действительными:

-username
_username_
__us_ername
us_er
username-
1user--name
132uname-
-uname1234
-username-
user--name
av34axc-
1234567890A1234567890B1234567890C1234567890D

И эти должны быть действительными:

Username
a-a
aBc
BaC
1-1
1-2-3-4
q-1-2-3
q-q-q-q-q
username
123username123
username3123
1234
user-name
13-13
q1-q2-q3
a
A
1234567890A1234567890B1234567890C123456
1234567890A123456-7890B1234567890C12345

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Вы можете использовать

^(?=.{1,39}$)[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*$

См. Демоверсию regex и график Regulex :

enter image description here

Подробности

  • ^ - начало строки
  • (?=.{1,39}$) - длина должна быть от 1 до 39 символов
  • [a-zA-Z\d]+ - 1+ буквенно-цифровых символов
  • (?:-[a-zA-Z\d]+)* - 0 или более повторений
    • - - дефис
    • [a-zA-Z\d]+ - 1+ буквенно-цифровые символы
  • $ - конец строки.
0 голосов
/ 08 апреля 2019

Для реализации ограничений дефиса можно использовать отрицательный прогноз:

^(?!.*-(-|$)|-)[a-z\d-]{1,39}$

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...