Mule 在dataweave中拆分字符串

Mule 在dataweave中拆分字符串,mule,dataweave,Mule,Dataweave,我有一个字符串,比如“嗨,我来自俄罗斯喀山”。输出应该是 Hi I am from Kazan, Russia 我尝试了regex[^\s\']+\'([^\']*)\“\'([^']*)”,它在上运行得很好。但是在dataweave中它什么也做不到。 这就是我试过的 %dw 1.0 %output application/json %function split(data) {returnData: data splitBy "[^\s\"']+|\"([^\"]*)\"|'([^']*)'

我有一个字符串,比如“嗨,我来自俄罗斯喀山”。输出应该是

Hi
I
am
from
Kazan, Russia
我尝试了regex
[^\s\']+\'([^\']*)\“\'([^']*)”
,它在上运行得很好。但是在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>
消息:null(java.lang.NullPointerException)。
有效载荷:com.mulesoft.weave.reader。DefaultSeekableStream@5d334a28
元素:/logFlow/processors/0@log:log.xml:14(转换消息)
元素XML:
%dw 1.0%输出应用程序/json---{payload:payload scan/[^\s\']+\'([^\']*)\“\'”([^']*)/}

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

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

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

使用此表达式

%dw 1.0 %输出应用程序/json %var splittedValue='嗨,我来自俄罗斯喀山'//splitBy''



splittedValue splitBy”“

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

Hello I am from "Kazan, Russia" 
以及:

以下示例使用:

  • 匹配所需的单词字符

  • 上进行显式匹配,以帮助匹配位置

  • 数组的输出

  • 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 ($$ ++ $)
    
    这对我很有用:

    
    %DW2.0

    %输出应用程序/json 有效载荷图((有效载荷01,indexOfPayload01)->{ accountType:payload01.accountType, 地址:payload01.street++payload01.city, 国家:payload01.country, creationDate:payload01.creationDate为:字符串, firstName:(payload01.name按“”)拆分[0], id:payload01.accountID, lastName:(payload01.name按“”)拆分[1], 英里数:有效载荷01.5英里, 邮政:payload01.postal })

    我在dataweave中通过创建一个调用splitBy()函数的userdefine函数实现了这一点 在下面的代码中,我正在分析firstname和lastname中从db返回的名称

    %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
    }
    

    你能解释一下正则表达式部分吗?
    \w++、\w++\w++
    的作用是什么?我知道
    \w
    将匹配非单词字符,但不会获得其余字符。
    %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
    }