如何在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函数:检查字符串是否存在匹配正则的子串(无需完全匹配整个字符串),结合^就能精准筛选出以_数字_为前缀的字符串
原失败写法原因分析
startsWith+正则转字符串:startsWith仅接受字符串参数,将正则转为字符串后会变成/_[0-9]_/字面量,实际是检查字符串是否以该字面量开头,不符合需求。~=运算符:DataWeave中~=要求完全匹配整个字符串,而目标字符串远长于_数字_,因此返回空。- 转义下划线的写法:同样受限于
~=的完全匹配规则,无法匹配更长的字符串,结果为空。
对比现有可行写法
现有写法item matches (/_[0-9]_[0-9]_[A-z0-9]*/)虽然能工作,但过于严苛:
- 强制要求前缀后必须是
_数字_结构,若后续格式变化(比如新增下划线或特殊字符)会匹配失败 - 正则表达式冗长,可读性差
而test结合^_\d_的写法更灵活,只要字符串开头符合_数字_的格式就会被筛选,完全满足需求且简洁易读。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

