Skip to content

Шаблоны ​

Шаблон — строка, в которой специальные символы означают «сюда вводится…», а всё остальное выводится как есть.

Синтаксис ​

СимволЗначение
9Цифра
aБуква любого алфавита
*Буква или цифра
[ ... ]Необязательная часть: заполняется целиком или не заполняется
\Следующий символ — как есть: \9 выведет девятку
любой другойВыводится как есть: скобки, пробелы, дефисы, +7
ts
mask('12345678', '(999) 999-99'); // '(123) 456-78'
mask('ab12', 'aa-99');            // 'ab-12'
mask('1230', '99:99[:99]');       // '12:30' — seconds are optional
mask('12', '\\9-99');             // '9-12'

Как обрабатывается ввод ​

  • Символы, которые не подходят к позиции, пропускаются: mask('a1b2', '99') → '12'.
  • Литералы после последнего введённого символа не дописываются — пользователь видит (123, а не (123) .
  • Литералы во вводе совпадают с литералами шаблона, поэтому форматирование уже отформатированного значения ничего не меняет.
  • Лишние символы отбрасываются.

Свои токены ​

Токен — регулярное выражение для одного символа и, по желанию, преобразование:

ts
const serial = createMask({
  pattern: 'HH-HH-HH',
  tokens: { H: { pattern: /[0-9a-f]/i, transform: 'upper' } },
});

mask('a1b2c3', serial); // 'A1-B2-C3'

transform — 'upper', 'lower' или функция (char) => string.

Несколько шаблонов ​

Массив шаблонов: выбирается первый, в который ввод помещается целиком. Перечисляйте от короткого к длинному:

ts
const code = createMask(['999-999', '9999-9999']);

mask('123456', code);   // '123-456'
mask('12345678', code); // '1234-5678'

Шаблон-функция ​

Когда шаблон зависит от введённого — например, от первых цифр номера карты:

ts
const cardMask = createMask({
  pattern: (input) => (/^3[47]/.test(input) ? '9999 999999 99999' : '9999 9999 9999 9999'),
});

Код страны в начале шаблона ​

Если шаблон начинается с литералов, похожих на ввод (+375, +998), они считаются введёнными, только когда ввод начинается с + или цифр больше, чем вмещает шаблон (вставили номер с кодом). Иначе первая цифра номера не «съедается» кодом страны: mask('331234567', phone('by')) → +375 (33) 123-45-67.

См. также ​