Оптимизация и улучшение регулярного выражения `имя пользователя`

#c# #regex #c#-4.0

#c# #регулярное выражение #c #-4.0

Вопрос:

Я создал это Regex для проверки имен пользователей, которые мне нужны в моих проектах:

 ^(?=.{3,32}$)(?!.*[._-]{2})(?!.*[0-9]{5,})[a-z](?:[w]*|[a-z0-9.]*|[a-z0-9-]*)[a-z0-9]$
  

Это работает просто отлично; но мне интересно, есть ли какие-либо улучшения и оптимизация для этого, поскольку я не совсем любитель регулярных выражений.

Регулярное выражение и тесты доступны здесь.

Правила таковы:

  • имена пользователей должны начинаться с [a-z]
  • имена пользователей должны заканчиваться на [a-z0-9]
  • имена пользователей могут иметь длину от 3 до 32
  • имена пользователей могут содержать любое из [a-z0-9._-]
  • Числа не должны находиться рядом друг с другом более 4 раз. Я имею в виду, p1234 совпадает, а p12345 нет.
  • каждое имя пользователя может содержать только одно из [._-] . Я имею в виду, что имя пользователя может содержать . или - или _
  • за каждым . , - и _ должно следовать буквенно-цифровое значение. Я имею в виду, что за . не может следовать другое . . Они не должны находиться поблизости друг от друга.

Тесты:

 j1vad-amiry            match
j1vad-ami-ry           match
ja23d_am8ry            match
ja_23d_am8ry           match
jav5d2.am3y            match
jav.ad.amiry           match
jav.ad.ami.ry.2        match
ja3fd4                 match
page2491               match
page24915              not match
jav-ad_amiry           not match
javad_am-iry           not match
jav.ami-ry             not match
jav.ami_ry             not match
jav.ami__ry            not match
2jav                   not match
2jav_ad                not match
2jav_ad3               not match
  

Заранее спасибо.

Комментарии:

1. Я бы разделил его на несколько проверок. Таким образом, вы могли бы сообщить, что именно не так с конкретным именем пользователя, а не просто «это неправильно». PS: performance тег здесь не имеет особого смысла.

2. Похоже на тему для CodeReview , но это не ТАК.

3. @HABO Я не знал о CodeReview сайте; Спасибо за упоминание. Я сейчас это проверяю.

4. @zerkms Я удалил performance тег

5. Вам не обязательно использовать regex для всего этого, верно? Гораздо проще проверить длину, например, в C #.