regex 在DataWeave中使用正则表达式过滤字符串

zaq34kh6  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(138)

我尝试在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]*/))

有人有更好的解决办法吗?

7cwmlq89

7cwmlq891#

您使用的大多数表达式的问题在于,您错误地使用了正则表达式、DataWeave或两者。

  • startWith()需要字符串参数,而不是正则表达式。
  • 运算符~=用于在比较中强制执行自动强制。不确定如何将其用于正则表达式。
  • 作为字符串的正则表达式:这是没有意义的,例如/_[0-9]_/已经是一个正则表达式了。
  • contains():在注解中建议,不尝试匹配整个输入。如果需要匹配完整的模式,那么它是不合适的。

请记住,筛选表达式的结果应为truefalse
最后一个是非常好的,如果你正在寻找模式,matches()函数返回一个布尔值,这正是filter()所需要的,matches()的正则表达式必须匹配整个输入字符串,你可以用\d替换[0-9],但结果是完全相同的。
要使用的实际逻辑或条件并不清楚。如果希望下划线字符之间的数字数量可变,则可以使用分组。根据数字后面的下一个字符是否应为字母,可以使用类似于以下内容的字符:

payload filter ($ matches /^(_\d)+_[A-Za-z].*/)

你首先需要理解你想要的逻辑,然后如果你的解决方案充分考虑了所有情况,那就没问题了。

相关问题