Регулярные выражения
Регулярные выражения сопоставляют и извлекают части строки. JSONata поддерживает литералы в привычных разделителях: /regex/flags, где regex — выражение, а флаги необязательны: i игнорирует регистр, m включает многострочное сопоставление.
Функции с регулярными выражениями
Регулярное выражение можно передать в $match(), $contains(), $split() и $replace().
Регулярные выражения в предикатах
В фильтрах используется сокращённая запись:
path.to.object[stringProperty ~> /regex/]
Account.Order.Product[`Product Name` ~> /hat/i]
~> — оператор цепочки: он передаёт значение функции, а литерал /regex/ при вычислении действительно возвращает функцию. Второй пример выберет товары, в названии которых есть hat без учёта регистра.
Универсальные сопоставители
Помимо JSON-типов JSONata имеет тип функции, поэтому /regex/ вычисляется в функцию-сопоставитель. Она принимает строку и возвращает объект деталей совпадения либо пустую последовательность (undefined), если совпадения нет.
$matcher := /[a-z]*an[a-z]*/i
$matcher('A man, a plan, a canal, Panama!')
Результат первого совпадения имеет форму:
{
"match": "man",
"start": 2,
"end": 4,
"groups": [],
"next": "<native function>#0"
}
match — совпавшая подстрока, start и end — позиции с нуля, groups содержит захватывающие группы, а next() возвращает следующее совпадение. В этом примере next() возвращает объект для canal с позициями 17 и 22; после последнего совпадения — пустую последовательность.
Пользовательский сопоставитель
Синтаксис regex лишь создаёт функцию с определённой сигнатурой и структурой результата. Четыре regex-функции вызывают её, не зная, что она создана литералом. Поэтому пользовательскую функцию-сопоставитель (лямбду или чаще extension-функцию), соблюдающую этот контракт, также можно передать в $match, $contains, $split и $replace.