Я пытаюсь отфильтровать ввод на основе регулярных выражений (регулярных выражений) в Dataweave. У меня есть входной массив полезной нагрузки в качестве ввода:
[
"description_1",
"description_2",
"Ruimte_1",
"_1_1_Candybar",
"_1_2_Groceryshop",
"description_3",
"Ruimte_2",
"_2_1_house1",
"_2_1_house2"
"description_4",
]
Когда я делаю обычный фильтр без такого регулярного выражения, я получаю правильный результат:
payload filter ((item, index) -> ((item startsWith "_1_") or (item startsWith "_2_")))
Вот результат:
[
"_1_1_Candybar",
"_1_2_Groceryshop",
"_2_1_house1",
"_2_1_house2"
]
Но проблема в том, что я могу получить любые числа в качестве входных данных. Итак, я попробовал Regex. DataWeave принимает для некоторых функций регулярное выражение, но в большинстве случаев нет.
Итак, я попробовал эти альтернативы:
payload filter ((item, index) -> item startsWith (/_[0-9]_/) as Regex as String)
//return is empty
payload filter ((item, index) -> item startsWith (/_[0-9]_/) as Regex as String)
//return is empty
payload filter ((item, index) -> item ~= ((/_[0-9]_/) as Regex) as String)
//return is empty
payload filter ((item, index) -> item ~= /_[0-9]_/)
//return is empty
// so I tried this escaping the _:
payload filter ((item, index) -> item ~= /\_[0-9]\_/)
// nothing is returned.
Я нашел то, что может сделать работу:
payload filter ((item, index) -> item matches (/_[0-9]_[0-9]_[A-z0-9]*/))
Кто-нибудь лучше знает, как это решить?
Попробуйте использовать содержит с /^_[0-9]_/
или соответствует /^_[0-9]_.*$/
Каким именно должен быть ожидаемый результат? Объясните, какие критерии вы хотите использовать для фильтрации входного массива.
Ввод отображается как результат в билете «Это результат». Я думаю, что лучшее решение — использовать спички. Спасибо за комментарии.
Лучше: 1) сделать более явным в вопросе, что это ожидаемый результат, 2) также уточнить логику или критерии, которые вы хотите использовать. В противном случае участникам необходимо сделать вывод из примеров, что требует дополнительной работы и может упускать некоторые случаи.
Проблема с большинством выражений, которые вы использовали, заключается в том, что вы неправильно используете либо регулярные выражения, либо DataWeave, либо и то, и другое.
~=
предназначен для принудительного автоматического принуждения к сравнению. Не уверен, как вы ожидали использовать его с регулярным выражением./_[0-9]_/
уже является регулярным выражением.Помните, что результатом выражения фильтра должно быть true
или false
.
Последний, который вы используете, отлично подходит, если вы ищете этот шаблон. Функция match() возвращает логическое значение, которое требуется filter(). Регулярное выражение для match() должно соответствовать всей входной строке. Вы можете заменить [0-9]
на \d
, но результат точно такой же.
Фактическая логика или критерии, которые вы хотите использовать, не ясны. Если вам нужно переменное число между символом подчеркивания, вы можете использовать группу. В зависимости от того, ожидается ли, что следующий символ после цифр будет буквой, вы можете использовать что-то вроде:
payload filter ($ matches /^(_\d)+_[A-Za-z].*/)
Сначала вам нужно понять логику, которую вы хотите. Тогда, если ваше решение адекватно рассматривает все случаи, тогда все в порядке.
Dataweave — это функциональный язык, и работа с dataweave требует много проб и ошибок. И, как вы заметили в начале, я ошибся с использованием startWith и ~=. Может быть, мне нужно было сначала прочитать руководство. Итак, уроки извлечены. Спасибо за вашу информацию, это помогает.
В Perl есть операция проверки регулярного выражения =~
, которая может выглядеть похожей, но полностью отличается от оператора DataWeave.
Я абсолютно новичок в dataweave. Если
item
является строкой, возможно, эти функции могут помочь? docs.mulesoft.com/dataweave/2.4/dataweave-cookbook-use-regex