Необязательные части маски

Необязательные части маски в Inputmask представляют собой механизм условного включения сегментов шаблона, которые могут присутствовать в вводе, но не являются обязательными для валидного соответствия. Это позволяет создавать гибкие шаблоны, адаптирующиеся к различным форматам данных без необходимости описывать отдельные маски для каждого варианта.

В библиотеке Inputmask наиболее распространённый способ задания необязательных сегментов — использование квадратных скобок:

[ ... ]

Содержимое внутри таких скобок рассматривается как необязательная часть маски и может быть полностью пропущено при вводе.

Базовое поведение

Inputmask("9999[99]").mask(element);

В данном случае допустимы два варианта ввода:

  • 1234
  • 123456

Последние две позиции (99) могут присутствовать, но не обязательны.

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

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

Квадратные скобки могут включать не только плейсхолдеры, но и фиксированные символы:

Inputmask("9999[ -9999]").mask(element);

Допустимые варианты:

  • 1234
  • 1234 -5678

В данном случае пробел, дефис и дополнительные цифры становятся опциональной группой. Это удобно для форматов, где дополнительная часть визуально отделяется, но не всегда используется.

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

Круглые скобки используются для логической группировки, а квадратные скобки — для обозначения опциональности всей группы:

Inputmask("(999) 999[ -9999]").mask(element);

Разбор поведения:

  • (999) 999 — обязательная часть
  • [ -9999] — необязательное расширение номера

Допустимые значения:

  • (123) 456
  • (123) 456 -7890

Такой подход применяется в телефонных масках с расширениями или внутренними добавочными номерами.

Вложенные необязательные конструкции

Inputmask допускает комбинирование групп и опциональных сегментов:

Inputmask("(999) 999[-9999[ ext 9999]]").mask(element);

Здесь структура имеет уровни:

  • обязательный номер (999) 999
  • первый уровень опциональности -9999
  • второй уровень опциональности ext 9999

Возможные варианты ввода:

  • (123) 456
  • (123) 456-7890
  • (123) 456-7890 ext 1234

Такая модель полезна для описания расширяемых идентификаторов, где дополнительные части зависят друг от друга.

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

Опциональные части часто комбинируются с квантификаторами:

Inputmask("9999[9{1,3}]").mask(element);

Интерпретация:

  • 9999 — фиксированная часть
  • [9{1,3}] — необязательный блок, содержащий от 1 до 3 цифр

Допустимые вводы:

  • 1234
  • 12345
  • 1234567

Такой подход применяется для расширяемых кодов, где длина дополнительного сегмента варьируется.

Взаимодействие опциональных частей и алиасов

При использовании алиасов (например, datetime, email, numeric) необязательные сегменты часто встроены в предопределённую структуру:

Inputmask({
  alias: "email",
  greedy: false
}).mask(element);

Хотя алиас email уже содержит сложную структуру, дополнительные необязательные правила могут применяться через пользовательские маски поверх базового поведения.

Пример расширения:

Inputmask("email[.test]").mask(element);

Здесь доменная зона .test становится необязательной добавкой, допустимой только при наличии базового email.

Жадность маски и влияние на опциональные сегменты

Параметр greedy влияет на то, как Inputmask распределяет ввод между обязательными и необязательными частями.

Inputmask("9999[99]", { greedy: false }).mask(element);

Поведение:

  • при greedy: true маска стремится заполнить необязательную часть сразу при наличии данных
  • при greedy: false необязательные сегменты активируются только при явном вводе дополнительных символов

Это особенно заметно при автозаполнении и вставке текста.

Условные необязательные сегменты в числовых масках

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

Inputmask("9{1,3}[.9{1,2}]").mask(element);

Разбор:

  • 9{1,3} — обязательная целая часть (1–3 цифры)
  • [.9{1,2}] — необязательная дробная часть

Возможные значения:

  • 7
  • 123
  • 7.5
  • 123.45

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

Необязательные сегменты в датах и времени

Маски даты часто используют опциональные временные компоненты:

Inputmask("99/99/9999[ 99:99]").mask(element);

Интерпретация:

  • 99/99/9999 — дата (обязательная часть)
  • [ 99:99] — время (необязательная часть)

Допустимые варианты:

  • 12/05/2026
  • 12/05/2026 14:30

Такая модель позволяет использовать единое поле для даты и даты-времени.

Необязательные части в составных идентификаторах

Часто опциональность применяется для расширений кодов:

Inputmask("AAA-999[9]").mask(element);

Разбор:

  • AAA — три буквы
  • 999 — обязательные цифры
  • [9] — дополнительная необязательная цифра

Допустимые значения:

  • ABC-123
  • ABC-1234

Это характерно для артикулов, серийных номеров и внутренних идентификаторов.

Поведение при удалении и редактировании

Опциональные сегменты влияют на поведение каретки и очистки:

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

Особенно важно поведение при backspace: удаление последнего символа обязательной части может привести к автоматическому удалению всего необязательного хвоста.

Конфликты опциональности и фиксированных разделителей

При неправильном проектировании маски возможны неоднозначности:

Inputmask("999[9]-999").mask(element);

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

Более устойчивый вариант:

Inputmask("999[9][-999]").mask(element);

или

Inputmask("9999[-999]").mask(element);

Выбор зависит от того, является ли расширение частью логической группы или отдельным сегментом.

Множественные опциональные сегменты

Маска может содержать несколько независимых опциональных блоков:

Inputmask("9999[99]-AAA[ 9999]").mask(element);

Разбор:

  • 9999 — обязательный числовой блок
  • [99] — дополнительное расширение
  • -AAA — обязательный буквенный сегмент
  • [ 9999] — дополнительный числовой суффикс

Допустимые комбинации:

  • 1234-ABC
  • 123456-ABC
  • 1234-ABC 7890

Практическая модель проектирования опциональных частей

При построении масок с опциональными сегментами ключевым становится разделение структуры на уровни:

  1. Базовый обязательный формат
  2. Расширения первого уровня
  3. Дополнительные вложенные расширения
  4. Визуальные разделители внутри опциональных блоков

Такая модель позволяет избегать избыточного количества отдельных масок и поддерживать единый шаблон для вариативных данных.

Поведение автозаполнения с опциональными блоками

При вставке значений Inputmask анализирует:

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

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

Ограничения опциональных частей

Несмотря на гибкость, опциональные сегменты имеют ограничения:

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

Нарушение этих правил приводит к нестабильному поведению маски при редактировании и вставке данных.