DataWeave如何按最大长度拆分字符串且不截断单词
DataWeave按最大长度拆分字符串不截断单词实现
问题说明
现有测试字符串:
"This is a native string for splitting test"
初始实现的拆分逻辑是按固定长度硬切,代码如下:
fun divideBy(str: String, size: Number): Array<String> = flatten(str scan ".{1,$(size)}") --- (payload.message divideBy 15) map (trim($))
该实现输出结果会从单词中间截断,不符合要求:
[
"This is a nativ",
"e string for sp",
"litting test"
]
预期要求是拆分后每个片段最大长度不超过15,拆分点必须选长度限制内最近的空格,不能截断单词,期望输出:
[
"This is a",
"native string",
"for splitting",
"test"
]
正确实现方案
通过递归逐段查找合法拆分点即可实现需求,同时兼容单个单词长度超过限制的边界场景,完整代码如下:
%dw 2.0 output application/json fun splitByMaxLen(str: String, maxLen: Number): Array<String> = if (sizeOf(trim(str)) <= maxLen) [trim(str)] else do { var tempChunk = str[0 to maxLen - 1] var lastSpaceIdx = lastIndexOf(tempChunk, " ") // 无空格时(单个单词超长)直接按最大长度切分,避免死循环 var splitPoint = if (lastSpaceIdx == -1) maxLen else lastSpaceIdx var currentPart = trim( if (splitPoint == maxLen) tempChunk else tempChunk[0 to splitPoint - 1] ) var remainPart = trim(str[splitPoint to -1]) --- [currentPart] ++ splitByMaxLen(remainPart, maxLen) } --- // 测试调用 splitByMaxLen("This is a native string for splitting test", 15)
逻辑说明
- 递归终止条件:剩余待处理字符串长度不超过最大限制,直接返回处理后的单元素数组
- 每轮处理先截取开头到最大长度位置的临时片段,查找片段内最后一个空格作为合法拆分点
- 拆分点前的内容去除首尾空格作为当前输出块,拆分点后的剩余内容去除首尾空格后递归执行相同拆分逻辑
- 增加单个单词长度超过最大限制的兼容逻辑,无可用空格拆分时直接按最大长度硬切,避免递归死循环
运行上述代码即可得到预期输出:
[ "This is a", "native string", "for splitting", "test" ]
内容的提问来源于stack exchange,提问作者hdnguyen
相关产品推荐
相关产品推荐

