Чтобы соответствовать всем русским буквам, всего [А-Яа-я]
диапазона недостаточно. Вы также должны добавить письмо [ёЁ]
в диапазон, так как оно не находится внутри этого.
Кроме того, неэкранированный дефис между буквальными символами внутри символьного класса создает диапазон, и его следует лучше положить в начале или конце класса символов.
Чтобы добавить ограничения, такие как должно быть как минимум N чего-то, вам нужно использовать привязанные образы.
var nameRegex = /^(?=[^A-ZА-ЯЁ]*[A-ZА-ЯЁ])(?=[^0-9]*[0-9])[-A-Z0-9А-ЯЁ.+~_!?*]+$/i;
Вот its demo
Здесь ^
якоря шаблон в начале строки, $
якоря его в конце, (?=[^A-ZА-ЯЁ]*[A-ZА-ЯЁ])
требует, по меньшей мере, одну букву, и (?=[^0-9]*[0-9])
требует по крайней мере одну цифру.
Примечание. Я удалил все буквы нижнего регистра, так как существует модификатор без учета регистра /i
.
Чтобы соответствовать только символы из списка используйте простой +
квантор:
var nameRegex = /^[-A-Z0-9А-ЯЁ.+~_!?*]+$/i;
^
Если вы позволяете пустую строку, используйте *
вместо +
.
Не только это регулярное выражение не соответствует 1 русской букве. Кроме того, главный разделитель регулярных выражений отсутствует. Попробуйте 'var nameRegex = '/ [-A-Z0-9А-ЯЁ. + ~ _!? *]/I';' –
@Wiktor Stribiżew в этом случае логин, хотя он содержит только латинские буквы, неверен – Heidel
So , каковы ваши требования? Вы не сказали, что должно быть не менее 1 латинского и не менее 1 русского письма. –