我尝试在Dataweave中基于regex(正则表达式)过滤输入。我有一个输入负载Array作为输入:
[
"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。datawave接受一些函数的regex,但大多数时候不接受。
所以我尝试了这些替代方案:
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]*/))
有人有更好的解决办法吗?
1条答案
按热度按时间7cwmlq891#
您使用的大多数表达式的问题在于,您错误地使用了正则表达式、DataWeave或两者。
~=
用于在比较中强制执行自动强制。不确定如何将其用于正则表达式。/_[0-9]_/
已经是一个正则表达式了。请记住,筛选表达式的结果应为
true
或false
。最后一个是非常好的,如果你正在寻找模式,matches()函数返回一个布尔值,这正是filter()所需要的,matches()的正则表达式必须匹配整个输入字符串,你可以用
\d
替换[0-9]
,但结果是完全相同的。要使用的实际逻辑或条件并不清楚。如果希望下划线字符之间的数字数量可变,则可以使用分组。根据数字后面的下一个字符是否应为字母,可以使用类似于以下内容的字符:
你首先需要理解你想要的逻辑,然后如果你的解决方案充分考虑了所有情况,那就没问题了。