Rust字符串转换库stringcase的使用:支持蛇形、驼峰等多样式大小写转换

use stringcase::snake_case;

fn main() {
    let input = "fooBar123Baz";
    let snake = snake_case(input);
    assert_eq!(snake, "foo_bar123_baz");
}
use stringcase::{snake_case_with_options, Options};

fn main() {
    let opts = Options{separate_before_non_alphabets: true, ..Default::default()};
    let input = "fooBar123Baz";
    let snake = snake_case_with_options(input, &opts);
    assert_eq!(snake, "foo_bar_123_baz");
}
use stringcase::{Caser, Options};

fn main() {
    let input = "fooBar123Baz";
    let snake = input.to_snake_case();
    assert_eq!(snake, "foo_bar123_baz");

    let opts = Options{separate_before_non_alphabets: true, ..Default::default()};
    let snake = input.to_snake_case_with_options(&opts);
    assert_eq!(snake, "foo_bar_123_baz");
}

完整示例代码:

// 引入stringcase库
use stringcase::{Caser, Options, camel_case, cobol_case, kebab_case, macro_case, pascal_case, snake_case, train_case};

fn main() {
    let input = "fooBar123Baz";
    
    // 基本转换函数示例
    println!("原始字符串: {}", input);
    println!("camelCase: {}", camel_case(input));          // 驼峰命名法
    println!("COBOL-CASE: {}", cobol_case(input));        // COBOL风格
    println!("kebab-case: {}", kebab_case(input));        // 短横线命名法
    println!("MACRO_CASE: {}", macro_case(input));        // 宏命名法
    println!("PascalCase: {}", pascal_case(input));       // 帕斯卡命名法
    println!("snake_case: {}", snake_case(input));        // 蛇形命名法
    println!("Train-Case: {}", train_case(input));        // 火车命名法
    
    // 使用选项进行转换
    let opts = Options {
        separate_before_non_alphabets: true,
        separate_after_non_alphabets: true,
        ..Default::default()
    };
    
    println!("\n使用选项转换:");
    println!("snake_case with options: {}", snake_case_with_options(input, &opts));
    
    // 使用方法进行转换
    println!("\n使用方法转换:");
    println!("to_camel_case: {}", input.to_camel_case());
    println!("to_snake_case: {}", input.to_snake_case());
    println!("to_pascal_case: {}", input.to_pascal_case());
    
    // 使用选项的方法转换
    println!("to_snake_case_with_options: {}", input.to_snake_case_with_options(&opts));
}

这个库提供了一些函数,可以在camelCase、COBOL-CASE、kebab-case、MACRO_CASE、PascalCase、snake_case和Train-Case之间转换字符串大小写。

基本上,这些函数只针对ASCII大写和小写字母进行大小写转换。除了ASCII大写和小写字母以及ASCII数字之外的所有字符都被视为单词分隔符并被移除。

如果想要使用某些符号作为分隔符,可以在Options结构的separators字段中指定这些符号,并使用相应大小写的〜case_with_options函数。

如果想要保留某些符号并将其他所有内容用作分隔符,可以在Options结构的keep字段中指定这些符号,并使用相应大小写的〜case_with_options函数。

此外,还可以通过转换选项指定是否在非字母字符前后放置单词边界。这可以通过Options结构中的separate_before_non_alphabets和separate_after_non_alphabets字段来设置。

不接受Options作为参数的〜_case函数只在非字母字符后放置单词边界。换句话说,它们的行为就像separate_before_non_alphabets = false和separate_after_non_alphabets = true一样。

该库支持Rust 1.56.1或更高版本。


1 回复

stringcase:Rust字符串大小写转换库

介绍

stringcase是一个功能丰富的Rust库,专门用于字符串的大小写格式转换。它支持多种常见的大小写命名约定,包括蛇形命名法、驼峰命名法等,适用于代码生成、数据序列化、API交互等多种场景。

主要功能

  • 蛇形命名法(snake_case)
  • 驼峰命名法(camelCase)
  • 帕斯卡命名法(PascalCase)
  • 常量命名法(CONSTANT_CASE)
  • 烤肉串命名法(kebab-case)
  • 标题命名法(Title Case)
  • 句子命名法(Sentence case)

安装方法

在Cargo.toml中添加依赖:

[dependencies]
stringcase = "2.0"

使用方法

基本转换示例

use stringcase::{camel_case, snake_case, pascal_case, constant_case, kebab_case};

fn main() {
    let input = "hello_world_example";
    
    // 转换为驼峰命名
    println!("{}", camel_case(input)); // "helloWorldExample"
    
    // 转换为蛇形命名
    println!("{}", snake_case(input)); // "hello_world_example"
    
    // 转换为帕斯卡命名
    println!("{}", pascal_case(input)); // "HelloWorldExample"
    
    // 转换为常量命名
    println!("{}", constant_case(input)); // "HELLO_WORLD_EXAMPLE"
    
    // 转换为烤肉串命名
    println!("{}", kebab_case(input)); // "hello-world-example"
}

处理特殊字符串

use stringcase::{title_case, sentence_case};

fn main() {
    let text = "hello world from rust";
    
    // 标题格式
    println!("{}", title_case(text)); // "Hello World From Rust"
    
    // 句子格式
    println!("{}", sentence_case(text)); // "Hello world from rust"
}

边界情况处理

use stringcase::{camel_case, snake_case};

fn main() {
    // 处理数字
    println!("{}", camel_case("user_id_123")); // "userId123"
    println!("{}", snake_case("userId123")); // "user_id_123"
    
    // 处理空字符串
    println!("{}", camel_case("")); // ""
    
    // 处理单个单词
    println!("{}", camel_case("hello")); // "hello"
}

自定义分隔符识别

use stringcase::{camel_case, with_options, Options};

fn main() {
    let options = Options::new().separator('-');
    let result = with_options("hello-world-example", &options, camel_case);
    println!("{}", result); // "helloWorldExample"
}

完整示例demo

// 引入stringcase库中的所有转换函数
use stringcase::{
    camel_case, snake_case, pascal_case, constant_case, kebab_case,
    title_case, sentence_case, with_options, Options
};

fn main() {
    // 示例字符串
    let input = "hello_world_example";
    let text = "hello world from rust";
    let mixed_input = "user_id_123";
    
    println!("=== 基本转换示例 ===");
    // 转换为驼峰命名
    println!("驼峰命名: {}", camel_case(input)); // "helloWorldExample"
    
    // 转换为蛇形命名
    println!("蛇形命名: {}", snake_case(input)); // "hello_world_example"
    
    // 转换为帕斯卡命名
    println!("帕斯卡命名: {}", pascal_case(input)); // "HelloWorldExample"
    
    // 转换为常量命名
    println!("常量命名: {}", constant_case(input)); // "HELLO_WORLD_EXAMPLE"
    
    // 转换为烤肉串命名
    println!("烤肉串命名: {}", kebab_case(input)); // "hello-world-example"
    
    println!("\n=== 特殊字符串处理 ===");
    // 标题格式
    println!("标题格式: {}", title_case(text)); // "Hello World From Rust"
    
    // 句子格式
    println!("句子格式: {}", sentence_case(text)); // "Hello world from rust"
    
    println!("\n=== 边界情况处理 ===");
    // 处理包含数字的字符串
    println!("包含数字的驼峰命名: {}", camel_case(mixed_input)); // "userId123"
    println!("包含数字的蛇形命名: {}", snake_case("userId123")); // "user_id_123"
    
    // 处理空字符串
    println!("空字符串: '{}'", camel_case("")); // ""
    
    // 处理单个单词
    println!("单个单词: {}", camel_case("hello")); // "hello"
    
    println!("\n=== 自定义分隔符识别 ===");
    // 使用自定义分隔符
    let options = Options::new().separator('-');
    let result = with_options("hello-world-example", &options, camel_case);
    println!("自定义分隔符转换: {}", result); // "helloWorldExample"
    
    println!("\n=== 综合示例 ===");
    // 综合演示各种转换
    let test_cases = vec![
        "hello_world",
        "HelloWorld",
        "hello-world",
        "HELLO_WORLD",
        "hello world"
    ];
    
    for case in test_cases {
        println!("原始: {}", case);
        println!("  蛇形: {}", snake_case(case));
        println!("  驼峰: {}", camel_case(case));
        println!("  帕斯卡: {}", pascal_case(case));
        println!("  常量: {}", constant_case(case));
        println!("  烤肉串: {}", kebab_case(case));
        println!("  标题: {}", title_case(case));
        println!("  句子: {}", sentence_case(case));
        println!("---");
    }
}

注意事项

  1. 库函数都是纯函数,不会修改原始字符串
  2. 所有转换函数都返回新的String实例
  3. 支持Unicode字符的转换
  4. 对于边界情况和特殊字符有良好的处理机制

性能建议

对于需要频繁转换的场景,建议将转换结果缓存起来,避免重复计算。

这个库为Rust开发者提供了简单易用且功能完整的字符串大小写转换解决方案。

回到顶部