如何在Rust中为字符串中的特定单词着色?

k4ymrczo  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(112)

我有一个Rust项目。它的目的是接受两个参数,一个搜索项和一个文件名,并打印文件的内容,其中文件中的搜索项被标记为红色。我如何做到这一点?下面是代码。

use std::env;
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::process;

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);
}

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?;
        println!("{}", 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();
        return Ok(InputArgs {
            search_term,
            file_name,
        });
    }
}

我已经找到了可以为整个字符串着色的库,但没有一个库只能为特定的单词着色。

zbsbpyhn

zbsbpyhn1#

大多数给字符串着色的板条箱实际上能够给单个单词着色。以colored为例:

use colored::Colorize;

fn main() {
    println!(
        "{} {} {}",
        "or use".cyan(),
        "any".italic().yellow(),
        "string type".cyan()
    );
}

如果你试图构建一个字符串,你也可以使用format!而不是println!来构建实际的字符串,而不是直接输出它,如下所示:

use colored::Colorize;

fn main() {
    let mut string = format!(
        "{} {} {}",
        "or use".cyan(),
        "any".italic().yellow(),
        "string type".cyan()
    );

    string.push_str(&*"! hello".cyan().to_string());

    println!("{string}");
}
sqougxex

sqougxex2#

我已经找到了解决问题的办法。下面是代码。

use colored::Colorize;
use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();

    let search_term: &str = &args[1];
    let file_name: &str = &args[2];

    println!(
        "Searching for term {} in file {}.\n",
        search_term.red().bold(),
        file_name.purple().italic()
    );

    search_file(search_term, file_name)
}

fn search_file(search_term: &str, file_name: &str) -> () {
    let content: String = fs::read_to_string(&file_name).expect("\nCould not read the file!");
    for word in content.replace("\n", " \n").split(" ") {
        if word.contains(search_term) {
            print!("{} ", word.red().bold())
        } else {
            print!("{} ", word)
        }
    }
    println!("")
}

相关问题