Регулярные выражения, составление логина, проверка на повтор символа

Как составить регулярное выражение, которое позволит ввести латинские цифры (строчные или заглавные), цифры (0-9), и/или знак нижнего подчёркивания _, но при условии, что _ в строке встречаться будет только 1 раз или не встречаться вовсе?

Мой пример: [A-Za-z0-9_?]{3,25}

К сожалению такой пример захватывает строку вне зависимости от того, сколько раз там "_" встречается. А нужно, чтобы если там было два и более раза - строка не захватывалась

Michelle_Onell - должно захватиться  
MichelleOnell - должно захватиться  
Michelle__Onell - не должно захватиться  
_Michelle - должно захватиться  
_Michelle_ - не должно захватиться  

и т.п.


Ответы (1 шт):

Автор решения: Shon Mason

Верные:

  1. ^(?=.{3,25}$)[a-zA-Z0-9]*_?[a-zA-Z0-9]*$ от Alexey Ten
  2. ^(?!.*__)(?=[^_]*_?[^_]*$)[A-Za-z0-9_]{3,25}$ от Dev18

В 2-ом выражении:

^(?!.*__) - снова запрещаем двойное нижнее подчёркивание.

(?=[^_]*_?[^_]*$) - проверка, что _ встречается не более одного раза (или не встречается вовсе).

[A-Za-z0-9_] - разрешённые символы. {3,25} - длина строки от 3 до 25 символов. $ - конец строки.

→ Ссылка