Фильтровать строки с помощью регулярного выражения в DataWeave

Я пытаюсь отфильтровать ввод на основе регулярных выражений (регулярных выражений) в 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]*/))

Кто-нибудь лучше знает, как это решить?

Я абсолютно новичок в dataweave. Если item является строкой, возможно, эти функции могут помочь? docs.mulesoft.com/dataweave/2.4/dataweave-cookbook-use-regex

Albina 25.12.2022 11:18

Попробуйте использовать содержит с /^_[0-9]_/ или соответствует /^_[0-9]_.*$/

The fourth bird 25.12.2022 11:45

Каким именно должен быть ожидаемый результат? Объясните, какие критерии вы хотите использовать для фильтрации входного массива.

aled 25.12.2022 13:10

Ввод отображается как результат в билете «Это результат». Я думаю, что лучшее решение — использовать спички. Спасибо за комментарии.

Ben 25.12.2022 13:15

Лучше: 1) сделать более явным в вопросе, что это ожидаемый результат, 2) также уточнить логику или критерии, которые вы хотите использовать. В противном случае участникам необходимо сделать вывод из примеров, что требует дополнительной работы и может упускать некоторые случаи.

aled 25.12.2022 13:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с большинством выражений, которые вы использовали, заключается в том, что вы неправильно используете либо регулярные выражения, либо DataWeave, либо и то, и другое.

  • startWith() ожидает строковые параметры, а не регулярные выражения.
  • Оператор ~= предназначен для принудительного автоматического принуждения к сравнению. Не уверен, как вы ожидали использовать его с регулярным выражением.
  • как Regex как String: это вообще не имеет смысла. Например, /_[0-9]_/ уже является регулярным выражением.
  • contains(): предлагается в комментарии, не пытается сопоставить весь ввод. Если полный шаблон должен совпадать, то он не подходит.

Помните, что результатом выражения фильтра должно быть true или false.

Последний, который вы используете, отлично подходит, если вы ищете этот шаблон. Функция match() возвращает логическое значение, которое требуется filter(). Регулярное выражение для match() должно соответствовать всей входной строке. Вы можете заменить [0-9] на \d, но результат точно такой же.

Фактическая логика или критерии, которые вы хотите использовать, не ясны. Если вам нужно переменное число между символом подчеркивания, вы можете использовать группу. В зависимости от того, ожидается ли, что следующий символ после цифр будет буквой, вы можете использовать что-то вроде:

payload filter ($ matches /^(_\d)+_[A-Za-z].*/)

Сначала вам нужно понять логику, которую вы хотите. Тогда, если ваше решение адекватно рассматривает все случаи, тогда все в порядке.

Dataweave — это функциональный язык, и работа с dataweave требует много проб и ошибок. И, как вы заметили в начале, я ошибся с использованием startWith и ~=. Может быть, мне нужно было сначала прочитать руководство. Итак, уроки извлечены. Спасибо за вашу информацию, это помогает.

Ben 25.12.2022 15:34

В Perl есть операция проверки регулярного выражения =~, которая может выглядеть похожей, но полностью отличается от оператора DataWeave.

aled 25.12.2022 21:54

Другие вопросы по теме