You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataWeave中使用正则表达式过滤字符串数组?

问题:DataWeave中用正则表达式过滤字符串数组的最优方案?

输入的字符串数组如下:

[
  "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"
]

但由于前缀中的数字可能是任意值,尝试用正则表达式处理时,多种写法均返回空数组:

payload filter ((item, index) -> item startsWith  (/_[0-9]_/) as Regex as String)
// 返回空数组
payload filter ((item, index) -> item ~= /_[0-9]_/)
// 返回空数组
// 尝试转义下划线:
payload filter ((item, index) -> item ~= /\_[0-9]\_/)
// 仍返回空数组

目前找到一种可行写法:

payload filter ((item, index) -> item matches (/_[0-9]_[0-9]_[A-z0-9]*/))

请问是否有更优的实现方案?


最优实现方案

可以使用DataWeave的test函数结合更简洁的正则表达式,实现更灵活且高效的过滤:

payload filter ((item) -> item test /^_\d_/)

方案说明

  • ^:正则锚点,限定匹配从字符串开头开始
  • \d:等价于[0-9],匹配任意单个数字
  • test函数:检查字符串是否存在匹配正则的子串(无需完全匹配整个字符串),结合^就能精准筛选出以_数字_为前缀的字符串

原失败写法原因分析

  1. startsWith+正则转字符串:startsWith仅接受字符串参数,将正则转为字符串后会变成/_[0-9]_/字面量,实际是检查字符串是否以该字面量开头,不符合需求。
  2. ~=运算符:DataWeave中~=要求完全匹配整个字符串,而目标字符串远长于_数字_,因此返回空。
  3. 转义下划线的写法:同样受限于~=的完全匹配规则,无法匹配更长的字符串,结果为空。

对比现有可行写法

现有写法item matches (/_[0-9]_[0-9]_[A-z0-9]*/)虽然能工作,但过于严苛:

  • 强制要求前缀后必须是_数字_结构,若后续格式变化(比如新增下划线或特殊字符)会匹配失败
  • 正则表达式冗长,可读性差

而test结合^_\d_的写法更灵活,只要字符串开头符合_数字_的格式就会被筛选,完全满足需求且简洁易读。


内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:55:21