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

如何使用Freemarker工具将长字符串分割为指定大小的块?

在FreeMarker中分割字符串为指定大小的块

嘿,这个需求其实有两种靠谱的实现方式,取决于你是否能修改后端Java代码,我都给你捋清楚:

方案一:Java端自定义扩展函数(灵活可控)

如果你的项目是Java+FreeMarker的架构,推荐在Java里实现一个自定义方法,然后注册到FreeMarker的配置中,这样模板里直接调用就行。

步骤1:实现自定义方法

写一个类继承TemplateMethodModelEx,实现分割逻辑:

import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import java.util.ArrayList;
import java.util.List;

public class SplitStringIntoChunks implements TemplateMethodModelEx {
    @Override
    public Object exec(List args) throws TemplateModelException {
        // 校验参数:第一个是字符串,第二个是块大小(整数)
        if (args.size() != 2) {
            throw new TemplateModelException("需要传入两个参数:字符串和块大小");
        }
        String input = args.get(0).toString();
        int chunkSize;
        try {
            chunkSize = Integer.parseInt(args.get(1).toString());
        } catch (NumberFormatException e) {
            throw new TemplateModelException("块大小必须是整数");
        }
        if (chunkSize <= 0) {
            throw new TemplateModelException("块大小必须大于0");
        }

        // 分割逻辑
        List<String> chunks = new ArrayList<>();
        int length = input.length();
        for (int i = 0; i < length; i += chunkSize) {
            int end = Math.min(i + chunkSize, length);
            chunks.add(input.substring(i, end));
        }
        return chunks;
    }
}

步骤2:注册到FreeMarker配置

在初始化FreeMarker配置的时候,把这个方法注册为模板可用的函数:

Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
// ... 其他配置(加载模板路径等)
cfg.setSharedVariable("splitIntoChunks", new SplitStringIntoChunks());

步骤3:模板中调用

现在在模板里就可以直接用这个函数了:

<#assign inputStr = "1234567890">
<#assign chunkSize = 3>
<#assign result = splitIntoChunks(inputStr, chunkSize)>

分割结果:${result}

输出结果就是:分割结果:["123", "456", "789", "0"]


方案二:纯FreeMarker模板实现(无需改Java)

如果不想动后端代码,也可以直接在模板里用内置指令和函数实现,虽然代码稍长,但胜在无需后端改动:

<#assign inputStr = "1234567890">
<#assign chunkSize = 3>
<#assign result = []>
<#assign strLength = inputStr?length>

<#list 0..<(strLength + chunkSize - 1)?intdiv(chunkSize) as index>
    <#assign start = index * chunkSize>
    <#assign end = (index + 1) * chunkSize>
    <#if end > strLength>
        <#assign end = strLength>
    </#if>
    <#assign result = result + [inputStr?substring(start, end)]>
</#list>

分割结果:${result}

代码解释:

  • 先计算需要循环的次数:(strLength + chunkSize - 1)?intdiv(chunkSize) 这是向上取整的写法,确保最后不足一块的部分也能被处理
  • 每次循环计算当前块的起始和结束索引,结束索引超过字符串长度时就取字符串长度
  • 把每个子串添加到结果列表中

运行这段模板,同样会得到你想要的结果:分割结果:["123", "456", "789", "0"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:03