#regex #azure-data-explorer #kql
Вопрос:
В соответствии с документацией мы можем использовать функцию replace_regex() для выполнения сложной замены в строках. Я хочу изменить первую букву в ключе json-поля на нижний регистр. Вот как выглядит мой код
let example = @'{"Id":"00000","Categories":[{"Position":208, "CategoryId":"XXX"}]}';
print(replace(""([^"] ?)"\s*:", @'l1', example))
Это не работает, потому что я не могу сделать ничего значимого в шаблоне замены.
replace(""([^"] ?)"\s*:", tolower(@''), example)
или
replace(""([^"] ?)"\s*:", (@'tolower()'), example)
тоже не работай.
переписать: Регулярное выражение замены для любого соответствия, выполненного с помощью matchingRegex. Используйте для ссылки на все совпадение, 1 для первой группы захвата, 2 и так далее для последующих групп захвата.
Можем ли мы использовать спички (, 1, 2) больше, чем просто объединение, как в примере?
Ответ №1:
Это не совсем возможно сделать с регулярным выражением. Частичное решение (которое изменяет ключи 1-го уровня) можно выполнить с помощью следующего запроса:
let example = parse_json(@'{"Id":"00000","Categories":[{"Position":208, "CategoryId":"XXX"}]}');
print x=example
| mv-apply kvp = example on
(
mv-expand kind=array kvp
| project k = tolower(kvp[0]), v=kvp[1]
| summarize x=make_bag(pack(k, v))
)
Комментарии:
1. Спасибо! Но если мы рассмотрим не только ключи, мы не сможем сделать что-то сложное с заменой регулярных выражений, не так ли?
2. Если вам нужны оба ключа/значения — вы можете вызвать tolower() для всей строки (это не должно влиять на анализ json). Замена регулярных выражений не позволяет запускать преобразование labmda для заменяемых строк (в некотором смысле, это то, что вы хотели: применить tolower() к 1)