Я хочу написать регулярное выражение, которое будет фильтровать любое имя пользователя, которое:
Может включать -
, но не может содержать более одного подряд
примерu-s-e-r
✔ us-er
✔ us--er
✖
Также имя пользователя не может начинаться с -
или заканчиваться на -
пример-user
✖ user-
✖
Самое близкое, что я пришел к своему результату, выглядит примерно так:
^[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
Вы можете использовать
^(?=.{1,39}$)[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*$
См. демонстрация регулярных выражений и Регулярный график:
Подробности
^
- начало строки(?=.{1,39}$)
- длина должна быть от 1 до 39 символов[a-zA-Z\d]+
- 1+ буквенно-цифровые символы(?:-[a-zA-Z\d]+)*
- 0 и более повторений
-
- дефис[a-zA-Z\d]+
- 1+ буквенно-цифровые символы$
- конец строки.Большое спасибо, это работает безупречно, есть ли у вас какие-либо книги/электронные книги/учебники по регулярным выражениям, которые могли бы мне помочь.
@neca Я могу предложить пройти все основные уроки в regexone.com, прочитать регулярные-выражения.info, Описание тега SO регулярного выражения (со многими другими ссылками на отличные онлайн-ресурсы) и пост сообщества SO под названием Что означает регулярное выражение. Также стоит взглянуть на rexegg.com. И, конечно же, следите за тегом SO regex, старайтесь отвечать здесь на вопросы о регулярных выражениях и никогда не сдавайтесь.
Обновлена ссылка. Спасибо, что дал мне знать!