Есть много способов сделать это. Я считаю, что общая характеристика c в том, что все они будут иметь позитивный взгляд на будущее. Вот еще один.
^(?=.{3,10}$)[a-z\d_.-]*[a-z][a-z\d_.-]*$
Демо
Обратите внимание, что [a-z\d_.-]*
появляется дважды. Некоторые механизмы регулярных выражений поддерживают подпрограммы (или подвыражения), которые позволяют сохранять повторяющуюся часть регулярного выражения в пронумерованной или именованной группе захвата для повторного использования позже в строке. Например, при использовании механизма PCRE вы можете написать
^(?=.{3,10}$)([a-z\d_.-]*)[a-z](?1)$
Demo
(?1)
заменяется токенами регулярного выражения, которые соответствуют строке, сохраненной для захвата группа 1 ([a-z\d_.-]*
), в отличие от \1
, которая ссылается на содержимое группы захвата 1. Использование подпрограмм может сократить выражение регулярного выражения, но, что более важно, это снижает вероятность ошибок при внесении изменений в регулярное выражение. жетоны, которые повторяются.