Перейти к основному содержимому
Версия: 2.0 (WIP)

Регулярные выражения

Регулярные выражения сопоставляют и извлекают части строки. 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.