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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:18:49