Валидация строковых значений в JSON Schema часто опирается на
регулярные выражения, задаваемые через ключевое слово
pattern. В библиотеке Ajv эти выражения компилируются в
нативные регулярные выражения JavaScript и применяются во время проверки
данных.
Ключевой особенностью является то, что pattern работает
исключительно с типом string и определяет ограничение на
соответствие всей строки регулярному выражению.
patternКлюч pattern задаёт регулярное выражение в виде
строки:
{
"type": "string",
"pattern": "^[a-zA-Z0-9_]+$"
}
Такое выражение ограничивает строку набором латинских букв, цифр и символа подчёркивания.
В Ajv регулярное выражение компилируется через конструктор
RegExp, поэтому используется синтаксис JavaScript, а не
PCRE или других диалектов.
Регулярное выражение в pattern не требует обязательного
использования ^ и $, однако их отсутствие
меняет семантику проверки.
^ — начало строки$ — конец строкиПример строгой проверки идентификатора:
{
"type": "string",
"pattern": "^[a-z]+\\d{3}$"
}
Без якорей выражение может совпасть с подстрокой, что часто приводит к логическим ошибкам валидации.
Регулярные выражения в JSON Schema записываются в виде JSON-строк, поэтому требуется двойное экранирование:
\d в регулярном выражении становится
"\\d"\. становится "\\."Пример:
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
Это выражение соответствует дате в формате
YYYY-MM-DD.
Ajv при компиляции схемы превращает каждое регулярное выражение в
объект RegExp. Это означает:
Включённый режим strict усиливает контроль за
потенциально некорректными выражениями.
JavaScript-движок в Ajv поддерживает Unicode-строки, однако поведение зависит от флагов регулярного выражения.
При необходимости обработки Unicode рекомендуется использовать флаг
u через inline-конструкции:
{
"type": "string",
"pattern": "^[\\p{L}]+$"
}
Такое выражение требует поддержки Unicode property escapes
(\p{L}), доступных в современных окружениях.
Регулярные выражения в Ajv имеют несколько важных ограничений:
i, m), если они не встроены в синтаксисПоэтому выражения с множественными вложенными квантификаторами требуют осторожности:
{
"pattern": "^(a+)+$"
}
Такие конструкции потенциально приводят к экспоненциальному времени выполнения.
Для объектов регулярные выражения применяются через
patternProperties, что позволяет валидировать ключи
объекта:
{
"type": "object",
"patternProperties": {
"^user_[0-9]+$": {
"type": "string"
}
}
}
В этом случае все ключи, соответствующие шаблону
user_число, должны иметь строковое значение.
Поведение при конфликте ключей регулируется комбинацией
additionalProperties:
{
"type": "object",
"patternProperties": {
"^id_": { "type": "number" }
},
"additionalProperties": false
}
Здесь разрешены только свойства, начинающиеся с id_.
Любые другие ключи будут отклонены.
В Ajv производительность зависит от сложности выражений:
^[a-z]+$) обрабатываются
быстроpatternProperties приводит к
последовательной проверке каждого ключаОптимизация достигается за счёт упрощения регулярных выражений и минимизации их количества.
Ajv компилирует схемы в функции валидации, где регулярные выражения уже инстанцированы. Это означает:
RegExp создаётся один раз при компиляцииРаспространённые проблемы:
^ и $Пример некорректного паттерна:
{
"pattern": "[a-zA-Z]+"
}
Такое выражение допускает частичное совпадение и не ограничивает строку полностью.
В Ajv одновременно могут использоваться format и
pattern. Их семантика различается:
format — семантическая проверка (email, uri, date)pattern — синтаксическая проверка через regexПример комбинирования:
{
"type": "string",
"format": "email",
"pattern": "^[a-z0-9._%+-]+@example\\.com$"
}
Такое сочетание ограничивает email конкретным доменом.
В больших схемах регулярные выражения часто используются для валидации идентификаторов, путей и кодов:
{
"type": "string",
"pattern": "^[A-Z]{2}-\\d{6}-[A-Z0-9]{4}$"
}
Подобные шаблоны применяются для формализации бизнес-идентификаторов и кода документов.
При несоответствии строки регулярному выражению Ajv формирует стандартную ошибку:
patternОшибки можно агрегировать через allErrors, что позволяет
получать полный список нарушений.
Регулярные выражения в JSON Schema используются как инструмент строгой типизации строковых данных. В Ajv они выступают как низкоуровневый механизм контроля формата, дополняющий семантические проверки.
Часто pattern применяется в следующих сценариях: