Синтаксис регулярных выражений в Inputmask

Роль регулярных выражений в механизме масок

Внутри системы масок Inputmask регулярные выражения используются как один из базовых способов описания допустимого ввода. Вместо пошагового описания позиции символов через предопределённые токены (9, a, *) может задаваться полноценное выражение проверки строки, которое определяет допустимые последовательности символов.

При этом регулярное выражение в Inputmask не всегда используется как классическая валидация строки целиком — оно интегрируется в поэтапный процесс ввода, где каждый символ проверяется в контексте текущего состояния маски.

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


Базовая форма задания регулярного выражения

В Inputmask регулярное выражение задаётся через параметр mask, если используется режим regex:

Inputmask({
  mask: /regex/
}).mask(element);

или в строковом виде:

Inputmask({
  mask: "[0-9]{3}-[0-9]{2}"
}).mask(element);

Однако именно форма /.../ активирует режим интерпретации как регулярного выражения, а не как классической маски.


Лексическая структура регулярных выражений

Регулярные выражения, используемые внутри Inputmask, сохраняют стандартный синтаксис JavaScript, но с важным ограничением: не все конструкции работают одинаково эффективно в пошаговой маске.

Основные элементы:

1. Литералы символов

Любой символ вне специальных операторов воспринимается буквально:

/abc/

означает строгую последовательность a → b → c.


2. Метасимволы

Метасимволы задают классы допустимых символов:

Символ Значение
. любой символ
\d цифра
\w буква, цифра или _
\s пробельный символ

Пример:

/\d\d\d/

означает ввод трёх цифр подряд.


Классы символов

Наборы в квадратных скобках

Regular Expressions поддерживают классы символов:

[abc]

означает один символ: a, b или c.

Диапазоны:

[0-9]
[a-z]
[A-Z]

Комбинации:

[0-9a-fA-F]

В контексте Inputmask такие классы активно используются для ограничения ввода по позиции.


Квантификаторы и их поведение в маске

Квантификаторы задают количество повторений символа или группы.

Базовые квантификаторы:

Конструкция Значение
{n} ровно n повторений
{n,m} от n до m повторений
* 0 или больше
+ 1 или больше
? 0 или 1

Пример:

/\d{4}/

означает четыре цифры подряд.


Особенности в Inputmask

В классическом regex * и + могут приводить к неоднозначности. В Inputmask они интерпретируются более строго, поскольку ввод происходит по символам:

  • + требует минимум одного символа сразу
  • * часто приводит к динамическому расширению маски

В практических масках предпочтение отдаётся фиксированным квантификаторам {n}.


Группировка и приоритет

Скобки используются для группировки:

/(abc)+/

означает повторение группы abc.

В Inputmask группировка важна для определения логических блоков ввода.

Приоритет операций:

  1. Скобки ( )
  2. Квантификаторы { }, +, *, ?
  3. Последовательность символов
  4. Альтернация |

Альтернация

Оператор | задаёт выбор между вариантами:

/cat|dog/

означает либо cat, либо dog.

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


Экранирование символов

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

Символ Экранирование
. \.
( \(
) \)
[ \[
] \]
+ \+
* \*

Пример:

/\(\d{3}\)/

соответствует телефонному коду в скобках.


Якоря строки

Якоря задают позиционную привязку:

Символ Значение
^ начало строки
$ конец строки

Пример:

/^\d{5}$/

означает строго пять цифр без лишних символов.

В Inputmask якоря часто избыточны, так как длина маски уже задаёт ограничение.


Жадность и поведение квантификаторов

Регулярные выражения по умолчанию жадные:

/\d+/

захватывает максимально возможное количество цифр.

В Inputmask это может конфликтовать с поэтапным вводом, поэтому предпочтение отдается ограниченным выражениям:

/\d{1,3}/

Специфика интерпретации regex в Inputmask

Регулярное выражение в Inputmask не всегда выполняется как единый матчинг-алгоритм. Оно разбивается на шаги:

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

Это накладывает ограничения:

Ограничение 1: отсутствие сложных lookahead/lookbehind

Конструкции вида:

(?=...)
(?!...)
(?<=...)
(?<!...)

либо игнорируются, либо работают нестабильно.


Ограничение 2: недетерминированные ветвления

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

/(a|ab|abc)/

На ранних стадиях ввода невозможно однозначно определить ветку.


Ограничение 3: приоритет простых шаблонов

Внутренний механизм Inputmask оптимизирован под:

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

Совмещение regex с масочными токенами

Регулярные выражения могут комбинироваться с символами маски:

Токен Значение
9 цифра
a буква
* буква или цифра

Пример гибридной маски:

Inputmask({
  mask: "999-\\d{2}"
})

Здесь первая часть обрабатывается как маска, вторая как regex-фрагмент.


Поведение символа точки

Точка (.) в regex:

/a.c/

означает любой символ между a и c.

В Inputmask использование . может приводить к слишком широкому допуску ввода, поэтому чаще заменяется на классы:

/a[0-9a-z]c/

Частичные совпадения и поток ввода

Ключевое отличие Inputmask от стандартного regex-движка заключается в поддержке частичных совпадений.

Пример:

/\d{4}/

Поддерживаемые состояния:

  • "" — допустимо (ввод не начат)
  • "1" — допустимо
  • "12" — допустимо
  • "1234" — завершённое совпадение
  • "12345" — недопустимо или обрезается

Производительность регулярных выражений

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

Более быстрые конструкции:

  • фиксированные длины {n}
  • простые классы [0-9]
  • линейные последовательности

Более медленные:

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

Практическая структура корректного regex для Inputmask

Оптимальная форма регулярного выражения для маски:

/^[0-9]{3}[A-Z]{2}\d{4}$/

Характерные признаки:

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

Логика разбора символов внутри Inputmask

При вводе:

  1. символ сопоставляется с текущей позицией
  2. проверяется соответствие regex-условию
  3. состояние маски обновляется
  4. пересчитывается доступная следующая позиция
  5. при несоответствии символ отклоняется или заменяется placeholder

Влияние режима greedy и lazy

Хотя классические флаги g, i, m, y, u доступны в JavaScript regex, в Inputmask они применяются ограниченно:

  • i влияет на буквенные классы
  • g не имеет смысла в поэтапной проверке
  • y может использоваться для строгого сопоставления позиции

Итоговые особенности синтаксиса regex в Inputmask

  • используется стандартный JavaScript regex-синтаксис
  • интерпретация адаптирована под пошаговый ввод
  • поддерживаются базовые конструкции: классы, группы, квантификаторы
  • ограничена поддержка сложных assert-операторов
  • предпочтение отдаётся линейным выражениям фиксированной длины
  • поведение отличается от классического RegExp-движка из-за инкрементальной проверки ввода