在数据编织中拆分字符串

Split string in dataweave

我有一个像 "Hi I am from "Kazan, Russia 这样的字符串。输出应该是

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>

参考 DataWeave 文档,正则表达式定义在 / 之间。因此,将双引号"替换为/。所以应该是这样的:/[^\s\"']+|\"([^\"]*)\"|'([^']*)'/

另一件事是,splitBy 将字符串拆分为单独元素的数组。所以你不会得到预期的结果。实际上,有效负载将被拆分为 5 个元素,但其内容为空。例如:"a,b,c" splitBy "," returns 3个元素:"a" - "b" - "c",comma/separator不是结果的一部分。

要获得预期结果,请尝试使用扫描。它 returns 一个包含给定字符串中所有匹配项的数组。可能你应该相应地修改正则表达式。

使用这个表达式

%dw 1.0 %输出application/json %var splittedValue='Hi I am from Kazan, Russia' //splitBy " "


splittedValue splitBy " "

我不确定您在初始查询中使用的语法,但以下内容应该适用于具有以下格式的有效负载:

Hello I am from "Kazan, Russia" 

和:

Hello I am from "Kazan, Russia

以下示例使用:

  1. Possessive Quantifiers 匹配所需的单词字符。

  2. , 上的显式匹配以帮助匹配位置。

  3. Reduce 数组的输出。

数据编织:

%dw 1.0
%input payload application/json
%output application/json
%var data =  "Hello I am from \"Whosebug, Internet\""
---
data scan /\w++, \w++|\w++/ reduce ($$ ++ $)

对我有用:

%dw 2.0</p> <h2>%输出application/json</h2> <p>有效载荷图((payload01,indexOfPayload01)-> { 帐户类型:payload01.accountType, 地址:payload01.street++payload01.city, 国家:payload01.country, 创建日期:payload01.creationDate 为:字符串, firstName: (payload01.name splitBy ' ')[0], 编号:payload01.accountID, lastName: (payload01.name splitBy ' ')[1], 英里:payload01.miles, 邮政:payload01.postal })

我通过创建一个调用 splitBy() 函数的用户定义函数在 dataweave 中实现了这一点 在下面的代码中,我在 firstname 和 last name

中从 db 解析名称 return
%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
}