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

如何在Rust中为字符串内指定单词着色?附项目实现需求

解决方案

要实现仅将文件中的搜索词标红,你可以使用colored库给特定子串添加颜色,以下是具体实现步骤:

1. 添加依赖

在你的Cargo.toml中添加colored依赖:

[dependencies]
colored = "2.0"

2. 修改代码

更新Rust代码,在处理每行文本时将搜索词替换为红色样式:

use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::process;
use colored::Colorize; // 引入颜色处理 trait

fn main() {
    let args: Vec<String> = env::args().collect();
    let input_args: InputArgs = InputArgs::new(&args).unwrap_or_else(|err| {
        println!("Problem parsing arguments: {}", err);
        process::exit(1)
    });
    println!(
        "Searching for {:?} in file {:?}.",
        input_args.search_term, input_args.file_name
    );
    run(&input_args).unwrap_or_else(|err| {
        println!("Error processing file: {}", err);
        process::exit(1);
    });
}

fn run(input_args: &InputArgs) -> io::Result<()> {
    let file = File::open(&input_args.file_name)?;
    let reader = io::BufReader::new(file);
    for line in reader.lines() {
        let line = line?;
        // 将行中所有匹配的搜索词替换为红色版本
        let colored_line = line.replace(&input_args.search_term, &input_args.search_term.red().to_string());
        println!("{}", colored_line);
    }
    Ok(())
}

struct InputArgs {
    search_term: String,
    file_name: String,
}
impl InputArgs {
    fn new(args: &[String]) -> Result<InputArgs, &str> {
        if args.len() < 3 {
            return Err("Please enter at least 2 arguments.");
        }
        let search_term: String = args[1].clone();
        let file_name: String = args[2].clone();
        Ok(InputArgs {
            search_term,
            file_name,
        })
    }
}

关键说明

  • colored::Colorize trait 为字符串提供了red()方法,该方法会返回带有ANSI红色控制码的字符串,终端识别后会将其显示为红色。
  • 使用str::replace方法将行内所有匹配的搜索词替换为红色样式版本,实现仅目标词着色的效果。

扩展:大小写不敏感搜索

如果需要支持大小写不敏感的搜索,可以引入regex库实现:

  1. 添加依赖:
[dependencies]
colored = "2.0"
regex = "1.10"
  1. 修改run函数的替换逻辑:
use regex::Regex;

fn run(input_args: &InputArgs) -> io::Result<()> {
    let file = File::open(&input_args.file_name)?;
    let reader = io::BufReader::new(file);
    // 构建大小写不敏感的正则,转义搜索词中的特殊字符
    let re = Regex::new(&format!("(?i){}", regex::escape(&input_args.search_term))).unwrap();
    for line in reader.lines() {
        let line = line?;
        let colored_line = re.replace_all(&line, |caps: &regex::Captures| {
            caps[0].red().to_string()
        });
        println!("{}", colored_line);
    }
    Ok(())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:13:17