Библиотека Inputmask поддерживает не только базовые шаблоны вида
9, a, *, но и полноценные
регулярные выражения, позволяющие строить сложные динамические маски с
условной логикой, проверками диапазонов и контекстной валидацией
ввода.
Продвинутые регулярные выражения используются в следующих сценариях:
regexСамый прямой способ использования регулярных выражений — параметр
regex.
Inputmask({
regex: "[A-Z]{3}-\\d{4}"
}).mask("#code");
Разрешённый ввод:
ABC-1234
XYZ-0001
Недопустимые значения:
ab-1234
ABCD-123
Здесь:
| Конструкция | Назначение |
|---|---|
[A-Z] |
заглавная буква |
{3} |
ровно три символа |
\\d |
цифра |
{4} |
четыре цифры |
Поскольку регулярное выражение передаётся как строка JavaScript, обратный слэш необходимо экранировать.
Неверно:
regex: "\d{4}"
Верно:
regex: "\\d{4}"
Либо через литерал RegExp:
regex: /\d{4}/
Inputmask({
regex: "([1-9]|[1-9][0-9]|100)"
}).mask("#percent");
Разрешаются числа:
1–100
Разбор выражения:
| Часть | Значение |
|---|---|
[1-9] |
1–9 |
[1-9][0-9] |
10–99 |
100 |
отдельное значение |
Inputmask({
regex:
"((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}" +
"(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])"
}).mask("#ip");
Поддерживаются адреса:
192.168.0.1
255.255.255.255
10.0.0.5
Запрещаются:
999.999.999.999
300.1.1.1
|Оператор | позволяет создавать множественные сценарии
ввода.
Inputmask({
regex: "(YES|NO)"
}).mask("#answer");
Допустимые значения:
YES
NO
Inputmask({
regex:
"(\\+7\\s\\(\\d{3}\\)\\s\\d{3}-\\d{2}-\\d{2})|" +
"(8\\s\\d{3}\\s\\d{3}-\\d{2}-\\d{2})"
}).mask("#phone");
Поддержка:
+7 (777) 123-45-67
8 777 123-45-67
Регулярные выражения поддерживают группировку через круглые скобки.
(AB|CD)-\d{2}
Подходит:
AB-12
CD-99
Не подходит:
EF-12
Символ ? делает группу необязательной.
Inputmask({
regex: "\\+7\\s?\\d{10}"
}).mask("#phone");
Поддерживаются оба варианта:
+77771234567
+7 7771234567
regex: "[A-Z]{5}"
Ровно 5 букв.
regex: "\\d{2,5}"
От 2 до 5 цифр.
regex: "[a-z]+"
Одна или более строчных букв.
regex: "^\\d+"
Строка должна начинаться с цифр.
regex: "\\.com$"
Строка должна оканчиваться на .com.
regex: "^\\d{4}$"
Только четыре цифры без дополнительных символов.
Inputmask({
regex:
"[a-zA-Z0-9._%+-]+@" +
"[a-zA-Z0-9.-]+\\." +
"[a-zA-Z]{2,}"
}).mask("#email");
Разрешаются:
user@test.com
admin123@mail.ru
Inputmask({
regex:
"(?=.*[a-z])" +
"(?=.*[A-Z])" +
"(?=.*\\d)" +
".{8,}"
}).mask("#password");
Требования:
(?=...)Lookahead позволяет проверять условие без включения его в итоговое совпадение.
(?=.*\d)
Означает:
где-то далее должна присутствовать цифра.
Пример:
Inputmask({
regex: "(?=.*\\d)(?=.*[A-Z]).{6,}"
}).mask("#secure");
(?!...)Запрещает определённые последовательности.
Inputmask({
regex: "^(?!admin).*"
}).mask("#login");
Недопустимо:
admin
administrator
Inputmask({
regex: "#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"
}).mask("#color");
Поддержка:
#FFF
#00FFAA
Inputmask({
regex:
"[0-9a-fA-F]{8}-" +
"[0-9a-fA-F]{4}-" +
"[0-9a-fA-F]{4}-" +
"[0-9a-fA-F]{4}-" +
"[0-9a-fA-F]{12}"
}).mask("#uuid");
Пример:
550e8400-e29b-41d4-a716-446655440000
Inputmask({
regex:
"([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}"
}).mask("#mac");
Поддерживается:
AA:BB:CC:DD:EE:FF
Регулярные выражения могут использоваться внутри
definitions.
Inputmask({
mask: "HH:MM",
definitions: {
"H": {
validator: "[0-2]"
},
"M": {
validator: "[0-5]"
}
}
}).mask("#time");
Более сложные проверки реализуются функцией
validator.
Inputmask({
mask: "99-99",
definitions: {
"9": {
validator: function(chrs, maskset, pos) {
return /[0-9]/.test(chrs);
}
}
}
}).mask("#custom");
Inputmask({
regex: "([01][0-9]|2[0-3]):[0-5][0-9]"
}).mask("#time");
Допустимо:
23:59
00:00
14:30
Недопустимо:
29:99
24:61
Inputmask({
regex:
"(0[1-9]|[12][0-9]|3[01])\\/" +
"(0[1-9]|1[0-2])\\/" +
"\\d{4}"
}).mask("#date");
regex: "\\d+"
Подходит любая длина числа.
regex: "^\\d{10}$"
Только 10 цифр.
Слишком сложные шаблоны могут вызывать:
Особенно опасны:
(.+)+
или
(.*a){10}
Подобные конструкции способны вызывать catastrophic backtracking.
(a|aa|aaa)+
a+
(.*)(\d)
.*\d
greedyInputmask({
regex: "\\d+",
greedy: false
}).mask("#number");
greedy: false уменьшает агрессивное заполнение
шаблона.
Поддержка кириллицы:
Inputmask({
regex: "[А-Яа-яЁё\\s]+"
}).mask("#russian");
Inputmask({
regex: "[A-Za-zА-Яа-яЁё]+"
}).mask("#mixed");
Inputmask({
regex:
"(https?:\\/\\/)?" +
"([\\w-]+\\.)+[\\w-]+" +
"(\\/[\\w- ./?%&=]*)?"
}).mask("#url");
postValidationДля сложной логики после проверки регулярного выражения.
Inputmask({
regex: "\\d+",
postValidation: function(buffer) {
const value = buffer.join("");
return Number(value) <= 1000;
}
}).mask("#range");
Inputmask.extendDefinitions({
"X": {
validator: "[A-F0-9]",
casing: "upper"
}
});
Использование:
Inputmask("XXXX-XXXX").mask("#hex");
Inputmask({
regex: "[A-HJ-NPR-Z0-9]{17}"
}).mask("#vin");
VIN исключает символы:
I
O
Q
Inputmask({
regex: "[A-Z]{2}-\\d{6}-[A-Z]"
}).mask("#serial");
Пример:
AB-123456-Z
Inputmask({
mask: [
"999-999",
"AA-9999"
],
keepStatic: false
}).mask("#dynamic");
Inputmask автоматически выбирает подходящий сценарий ввода.
Inputmask({
regex: "\\d{20}"
}).mask("#bank");
Inputmask({
regex:
"[A-Z]{2}\\d{2}[A-Z0-9]{1,30}"
}).mask("#iban");
Для сложных структур регулярные выражения становятся трудно поддерживаемыми.
Плохая практика:
regex: "\\{.*\\}"
Лучше:
Регулярные выражения не подходят для:
В подобных случаях применяются: