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

在Rust中如何将字符串分割为指定长度的子串?

在Rust中按指定长度分割字符串为子串集合

嘿,这个需求我之前也碰到过,给你分享几种实用的实现方式,完美解决你把字符串按指定长度分割成子串集合的问题~

方法一:针对ASCII字符串的高效实现(适合你的示例场景)

如果你的字符串是纯ASCII字符(就像例子里的"AAABBBCCC"),可以直接利用字节切片的chunks方法,这种方式效率很高:

fn split_into_chunks(s: &str, chunk_size: usize) -> Vec<&str> {
    s.as_bytes()
        .chunks(chunk_size)
        .map(std::str::from_utf8)
        .collect::<Result<_, _>>()
        .unwrap()
}

fn main() {
    let input = "AAABBBCCC";
    let chunks = split_into_chunks(input, 3);
    println!("{:?}", chunks); // 输出: ["AAA", "BBB", "CCC"]
}

说明

  • 先把字符串转成字节切片,用chunks按指定长度分割成多个字节子切片;
  • 再通过std::str::from_utf8把每个字节子切片转回字符串;
  • 注意:这种方法只适用于ASCII字符串,如果包含中文、emoji这类多字节UTF-8字符,会破坏字符编码导致转换失败。

方法二:支持通用UTF-8字符串的安全实现

如果需要处理包含非ASCII字符的字符串(比如中文、特殊符号),就得按字符数而不是字节数分割,避免破坏字符编码。这里用标准库就能实现:

fn split_into_char_chunks(s: &str, chunk_size: usize) -> Vec<String> {
    s.chars()
        .enumerate()
        .fold(Vec::new(), |mut acc, (index, c)| {
            // 每到第chunk_size个字符,就新建一个空字符串
            if index % chunk_size == 0 {
                acc.push(String::new());
            }
            // 把当前字符添加到最后一个子串里
            acc.last_mut().unwrap().push(c);
            acc
        })
}

fn main() {
    // 测试ASCII场景
    let input = "AAABBBCCC";
    let chunks = split_into_char_chunks(input, 3);
    println!("{:?}", chunks); // 输出: ["AAA", "BBB", "CCC"]

    // 测试非ASCII场景
    let non_ascii_input = "我爱Rust编程";
    let non_ascii_chunks = split_into_char_chunks(non_ascii_input, 2);
    println!("{:?}", non_ascii_chunks); // 输出: ["我爱", "Ru", "st", "编程"]
}

说明

  • 遍历字符串的每个字符,用enumerate记录字符的索引;
  • 利用fold方法逐步构建子串集合:每当索引是chunk_size的倍数时,新建一个空字符串,然后把当前字符添加到最后一个子串中;
  • 这种方法完全兼容UTF-8编码,不会破坏任何字符。

方法三:用第三方库简化代码

如果不介意引入第三方依赖,itertools库提供了更简洁的chunks方法,能直接对字符迭代器进行分组:

首先在Cargo.toml中添加依赖:

[dependencies]
itertools = "0.12.0"

然后编写代码:

use itertools::Itertools;

fn split_into_chunks_itertools(s: &str, chunk_size: usize) -> Vec<String> {
    s.chars()
        .chunks(chunk_size)
        .into_iter()
        .map(|chunk| chunk.collect())
        .collect()
}

fn main() {
    let input = "AAABBBCCC";
    let chunks = split_into_chunks_itertools(input, 3);
    println!("{:?}", chunks); // 输出: ["AAA", "BBB", "CCC"]
}

说明

  • itertools::Itertools trait给迭代器添加了chunks方法,能直接按指定长度分组;
  • 每个分组是一个字符迭代器,用collect()转成字符串即可;
  • 代码非常简洁,同时也支持UTF-8字符。

总结

  • 纯ASCII字符串:选方法一,效率最高;
  • 需要兼容UTF-8字符:选方法二(无依赖)或方法三(代码简洁);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:24:06