【问题标题】:Get decimal value from string using Mule Expression Language and Regex使用 Mule 表达式语言和正则表达式从字符串中获取十进制值
【发布时间】:2018-02-18 17:02:51
【问题描述】:

此问题涉及 Mule 的 MEL 和正则表达式。我有以下 JSON 有效负载。

    {
       "balance": "{Amount={BasicAmount=604.45, MinimumAmount=60 445, CurrencyCode=USD}}"
    }

我可以访问由 balance 表示的字符串

    {Amount={BasicAmount=604.45, MinimumAmount=60 445, CurrencyCode=USD}}

我需要将浮点数 604.45 作为字符串访问,并将其作为流变量应用。因此,我在我的 mule 应用程序中实现了以下代码。

    <set-variable variableName="balanceUnrefined" value="#[json:balance]" doc:name="balanceUnrefined"/>
    <logger message="#[flowVars.balanceUnrefined]" level="INFO" doc:name="Logger"/>
    <set-variable variableName="balanceRefined" value="#[regex('\\d+\\.\\d+'.toString(), flowVars.balanceUnrefined)]" doc:name="balanceRefined"/>
    <logger message="#[flowVars.balanceRefined]" level="INFO" doc:name="Logger"/>

最后一个记录器的结果显示为空。我做错了什么?是正则表达式吗?

【问题讨论】:

  • 所以你需要这样的正则表达式吗? ^{Amount={BasicAmount=(([0-9]{1,3})\.([0-9]{1,2}))(.*)$您可以访问您的号码访问正则表达式的第 1 组
  • 您可以在这里玩得开心:regex101.com 尝试将我的正则表达式放在正则表达式字段和字符串下方;)
  • 因为你的正则表达式看起来不错,我删除了我的答案。
  • 所以,我睡觉了,然后我在 mulesoft.com 获得免费试用,并使用在线设计器测试你的正则表达式没问题。我还看到最新的数据波规范是 2.0 而不是 1.0(您使用的那个)。我使用了scan 函数:这里是我的 mule-config.xml 的摘录:&lt;ee:set-variable variableName="balance"&gt; &lt;![CDATA[ %dw 2.0 output application/json --- scan(vars.regexpVar, /\d+\.\d+/)[0] ]]&gt; &lt;/ee:set-variable&gt; &lt;/ee:variables&gt; &lt;/ee:transform&gt; &lt;logger doc:id="b458c5f0-5360-40f4-b68c-b5cf1e48da51" doc:name="Logger" doc:timestamp="1518874066833" message="#[vars.balance]"/&gt;
  • 如果您想获得一些反馈,或者您更愿意等待用户使用旧数据波规范 1.0 的桌面版 Anypoint Studio,请告诉我

标签: regex mule mule-studio anypoint-studio mule-esb


【解决方案1】:

根据我们的讨论:

也可以使用scan 函数。它返回一个List&lt;String&gt;,所以你必须采取第一个。它适用于 dw 2.0 上的正则表达式,所以应该在 de 1.0 中使用。

我的骡子 4 mule-config.xml:

<ee:set-variable variableName="balance"> <![CDATA[ %dw 2.0 output application/json --- scan(vars.regexpVar, /\d+\.\d+/)[0] ]]> </ee:set-variable> </ee:variables> </ee:transform> <logger doc:id="b458c5f0-5360-40f4-b68c-b5cf1e48da51" doc:name="Logger" doc:timestamp="1518874066833" message="#[vars.balance]"/>

这里是我的结果日志:

【讨论】:

  • 感谢@shadowsheep,但这不起作用,因为浮点数的值可以改变。我进一步测试了它,这是任何点工作室收到的错误:执行表达式“regex('^{Amount={BasicAmount=(([0-9]{1,3})\\.([0- 9]{1,2}))(.*)$'.toString(), flowVars.balanceUnrefined)" 失败。 (org.mule.api.expression.ExpressionRuntimeException)。
  • @mdennism 哦,你是对的:这个对吗? ^{Amount={BasicAmount=(([0-9]+)\.([0-9]+))(.*)$
  • @mdennism 浮点部分是否也丢失了?我的意思是你可以得到 Amount=63 或总是 Amount=63.0 或 63.00?
  • 浮点数将始终以 78.00 或 3472.38 的形式出现。您在 regex101.com 上的正则表达式会捕获所有内容。这适用于 regex101.com 上的 \d+\.\d+ 但是在 Anypoint studio 中它不起作用。
  • @mdennism 是的,我知道我的正则表达式捕获了您的整个字符串,但最重要的是第 1 组是您的号码。我没有与 mulesoft 任何点工作室一起使用,但使用有效的正则表达式和你在组中的值,你可以从该组中提取正确的值。
【解决方案2】:

我不得不使用变压器来使用@shadowsheep 推荐的扫描功能,并感谢他做对了。这适用于 Mule 3.9 和使用 dataweave 1.0

<set-variable variableName="balanceUnrefined" value="#[json:balance]" doc:name="balanceUnrefined"/>
        <set-payload value="#[flowVars.balanceUnrefined]" doc:name="Set Payload"/>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{
	"balance": payload scan /\d+\.\d+/
}
]]></dw:set-payload>
        </dw:transform-message>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>

【讨论】:

  • 请考虑接受我的回答,因为我的回答是正确的,而且由于我的发现,您完成了工作。
  • 嗨@shadowsheep 我已经接受了你的回答。我只是为了 mule 3.9 和 dw1.0 应用程序的利益而发布了我的答案。您可以看到两者的扫描功能应用程序是不同的。您也可以发布它,我将删除此答案。
  • 好吧@mdennism 现在公平了;)。很高兴停下来,编码愉快!
  • 我投了赞成票,但我没有什么名声,所以只记录了。
  • 好的@mdennism 我支持你,帮助你成长! C'ya!
猜你喜欢
  • 2014-04-24
  • 2018-11-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多