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

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

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

    пример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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
275
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Обновлена ​​ссылка. Спасибо, что дал мне знать!

trincot 08.04.2019 19:55
Ответ принят как подходящий

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

^(?=.{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 08.04.2019 19:57

@neca Я могу предложить пройти все основные уроки в regexone.com, прочитать регулярные-выражения.info, Описание тега SO регулярного выражения (со многими другими ссылками на отличные онлайн-ресурсы) и пост сообщества SO под названием Что означает регулярное выражение. Также стоит взглянуть на rexegg.com. И, конечно же, следите за тегом SO regex, старайтесь отвечать здесь на вопросы о регулярных выражениях и никогда не сдавайтесь.

Wiktor Stribiżew 08.04.2019 20:02

Другие вопросы по теме