Обработка специальных символов

В библиотеке Inputmask специальные символы формируют основу описания структуры вводимых данных. Они определяют допустимые классы символов, поведение курсора, обязательность ввода и правила форматирования. Маска воспринимается не как обычная строка, а как набор инструкций, где каждый символ может иметь семантическое значение.

Ключевые базовые символы:

  • 9 — обязательная цифра (0–9)
  • a — обязательная буква (A–Z, a–z)
  • * — обязательный алфавитно-цифровой символ
  • [] — необязательные группы символов
  • {} — квантификаторы повторений (в расширенных режимах)
  • \ — символ экранирования

Эти элементы формируют синтаксический каркас большинства масок.


Цифровые и символьные маски

Символ 9

Символ 9 используется для обозначения строго числового ввода:

  • допускает только цифры
  • каждый 9 соответствует одной позиции
  • любые другие символы блокируются на уровне ввода

Пример маски:

9999

Такая маска ограничивает ввод четырьмя цифрами.


Символ a

Символ a задаёт буквенный ввод:

  • разрешены латинские буквы
  • регистр обычно не критичен
  • недопустимы цифры и спецсимволы

Пример:

aaaa

Используется в кодах, идентификаторах, простых текстовых полях.


Символ *

Символ * объединяет возможности 9 и a:

  • допускает буквы и цифры
  • используется для универсальных полей
  • часто применяется в серийных номерах

Пример:

****-****

Литеральные символы и автоматическое восприятие

Любые символы, не являющиеся управляющими, рассматриваются как литералы. Они отображаются в поле ввода и становятся частью фиксированной структуры.

Пример:

+7 (999) 999-99-99

В данном случае:

  • +, (, ), - — литералы
  • 9 — динамические позиции ввода

Inputmask автоматически фиксирует позицию курсора так, чтобы литералы не могли быть удалены обычным вводом.


Экранирование специальных символов

В масках часто возникает конфликт между символами данных и управляющими конструкциями. Для разрешения используется обратный слэш \.

Базовый принцип

\9  → литерал "9"
\a  → литерал "a"
\*  → литерал "*"

Экранирование отменяет специальное значение символа.


Экранирование разделителей и скобок

Некоторые символы имеют синтаксическое значение и требуют обязательного экранирования:

  • [ и ]
  • { и }
  • ( и )
  • |, ?, +, *

Пример:

\[999\]

Результат: отображается как [123], где цифры вводятся пользователем.


Квадратные скобки и необязательные блоки

Конструкция [] используется для задания необязательных частей маски.

Поведение

  • содержимое внутри скобок может быть пропущено
  • маска остаётся валидной без заполнения блока
  • применяется для расширяемых форматов

Пример:

9999[-999]

Здесь:

  • первая часть обязательна
  • вторая — дополнительный расширяемый блок

Вложенные необязательные элементы

Inputmask поддерживает сложные конструкции:

(999)[-aaa]
  • основная часть — обязательная
  • буквенный суффикс — опциональный

Такая структура используется для гибких идентификаторов.


Кастомные определения (definitions)

Inputmask позволяет переопределять поведение символов через объект definitions.

Базовый механизм

Inputmask({
  mask: "##-##",
  definitions: {
    "#": {
      validator: "[A-F0-9]",
      cardinality: 1
    }
  }
}).mask(element);

Поведение

Каждое определение включает:

  • validator — правило допустимых символов
  • cardinality — количество символов на позицию
  • casing — преобразование регистра (опционально)

Расширение стандартных символов

Можно модифицировать поведение 9, a, *, но это редко применяется, так как нарушает ожидаемую семантику.


Обработка регулярных выражений внутри масок

Хотя Inputmask не является полноценным движком регулярных выражений, он поддерживает их элементы через definitions.

Пример интеграции regex

mask: "999-AAA"
definitions: {
  A: { validator: "[A-Z]" }
}

Ограничения

  • регулярные выражения применяются на уровне одного символа
  • отсутствует поддержка групп и захвата
  • невозможны сложные условия внутри маски

Особые случаи обработки символов

Пробелы

Пробелы могут вести себя как:

  • литералы (фиксированные позиции)
  • динамические разделители (в зависимости от конфигурации)

Пример:

999 999 999

Разделители

Часто используются:

  • -
  • .
  • /
  • :

Они не требуют экранирования и интерпретируются как фиксированные символы.


Unicode и локализация

Inputmask работает с Unicode-символами, однако поведение зависит от типа маски:

  • a может ограничиваться латиницей в стандартной конфигурации
  • расширенные настройки позволяют разрешить кириллицу через definitions

Пример:

definitions: {
  "c": { validator: "[А-Яа-яЁё]" }
}

Ошибки при работе со специальными символами

Потеря экранирования

(999)

Может интерпретироваться как группа, а не как литерал, если не настроено явно.


Конфликт символов маски и данных

Использование символов 9, a, * в качестве литералов без экранирования приводит к:

  • неверной валидации
  • смещению курсора
  • некорректному форматированию

Неправильные необязательные блоки

Ошибочные конструкции:

[999
999]

Ведут к нарушению структуры маски и игнорированию части правил.


Избыточное экранирование

Чрезмерное использование \:

\\9

может привести к тому, что символ будет интерпретирован буквально, а не как управляющий элемент.