Вы можете опустить отрицательный вид сзади в конце, но также опустить 2 других отрицательных взгляда (?![_])(?!.*[_]{2})
и использовать только один в начале, чтобы проверить длину 3 - 20.
Вместо2 отрицательных просмотра, вы можете соответствовать 1+ раз [a-zA-Z0-9]
, чтобы строка не могла начинаться с подчеркивания.
Затем используйте повторяющийся шаблон для сопоставления одного _
, а затем снова 1+ раз [a-zA-Z0-9]
, чтобы строка не заканчивалась подчеркиванием.
^(?=.{3,20}$)[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)+$
См. Regex demo