У меня есть строка типа «Привет, я из« Казани, Россия ». Результат должен быть

Hi
I
am
from
Kazan, Russia

Я попробовал регулярное выражение [^\s\"']+|\"([^\"]*)\"|'([^']*)', которое отлично работает на regexp.com. Но в dataweave он ничего не делает. Это то, что я пробовал

%dw 1.0
%output application/json
%function split(data) {returnData: data splitBy "[^\s\"']+|\"([^\"]*)\"|'([^']*)'"}
---
split(payload)[0]

Изменить 1

Я попробовал оператор сканирования
Вот что я сделал

%dw 1.0
%output application/json
---
{
payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/
}

Но я получаю NullPointerException
Трассировка стека

Message               : null (java.lang.NullPointerException).
Payload               :      com.mulesoft.weave.reader.DefaultSeekableStream@5d334a28
Element               : /logFlow/processors/0 @ log:log.xml:14 (Transform Message)
Element XML           : <dw:transform-message doc:name="Transform Message" metadata:id="87d4353c-240d-4b1c-84b4-171f6c11045b">
                    <dw:input-payload mimeType="plain/text"></dw:input-payload>
                    <dw:set-payload>%dw 1.0%output application/json---{payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/}</dw:set-payload>
                    </dw:transform-message>
3
Abhay 6 Сен 2016 в 18:09

5 ответов

Лучший ответ

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

Hello I am from "Kazan, Russia" 

А также:

Hello I am from "Kazan, Russia

В приведенном ниже примере используются:

  1. Положительные квантификаторы, соответствующие требуемые символы слова.

  2. Явное совпадение на ,, чтобы помочь сопоставить местоположение.

  3. Уменьшить вывод массива .

DataWeave:

%dw 1.0
%input payload application/json
%output application/json
%var data =  "Hello I am from \"StackOverflow, Internet\""
---
data scan /\w++, \w++|\w++/ reduce ($$ ++ $)
1
Matt Jones 19 Апр 2017 в 15:47

Меня устраивает:

%dw 2.0

% выходного приложения / JSON

Карта полезной нагрузки ((payload01, indexOfPayload01) -> {accountType: payload01.accountType, address: payload01.street ++ payload01.city, country: payload01.country, creationDate: payload01.creationDate as: string, firstName: (payload01.name splitBy '') [0], id: payload01.accountID, lastName: (payload01.name splitBy '') [1], miles: payload01.miles, postal: payload01.postal})

1
Md. Kamruzzaman 26 Май 2019 в 12:26

Я добился этого в dataweave, создав пользовательскую функцию, которая вызывает функцию splitBy (). В приведенном ниже коде я разбираю имя, возвращаемое из базы данных, в имени и фамилии.

%dw 2.0
output application/json
fun split(data) = data splitBy (" ")
---
payload map ( payload01 , indexOfPayload01 ) -> {
    id: payload01.accountID default "",
    address: ((payload01.street default "") ++ (payload01.city default "")) ++ (payload01.state default ""),
    postal: payload01.postal default "",
    country: payload01.country default "",
    creationDate: payload01.creationDate as String default "",
    accountType: payload01.accountType default "",
    firstName: split(payload01.name)[0],
    lastName: split(payload01.name)[1],
    miles: payload01.miles default 0
}
0
mudassir ahmed 12 Ноя 2019 в 07:12

Ссылаясь на документацию DataWeave, регулярные выражения определяются между / . Поэтому замените двойные кавычки " на / . Это должно быть так: /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/

Другое дело, splitBy разбивает строку на массив отдельных элементов. Так что ожидаемого результата вы не получите. Действительно, полезная нагрузка будет разделена на 5 элементов, но ее содержимое будет пустым. Например: "a,b,c" splitBy "," возвращает 3 элемента: «a» - «b» - «c», запятая / разделитель не является частью результата.

Чтобы получить ожидаемый результат, попробуйте использовать сканирование . Он возвращает массив со всеми совпадениями в данной строке. Возможно, вам следует соответствующим образом изменить регулярное выражение.

1
sulthony h 6 Сен 2016 в 22:54

Используйте это выражение

% dw 1.0% output application / json% var splittedValue = 'Привет, я из Казани, Россия' // splitBy ""


SplittedValue splitBy ""

0
Zahid 5 Мар 2017 в 03:31