Rust中如何过滤字符串仅保留字母、数字与空格以匹配关键词?
Rust 文件扫描:过滤特殊字符并匹配关键词
核心思路
先对文件内容做全局预处理,过滤掉所有非字母、数字、空格的字符,再按空格分割单词进行匹配,就能解决带括号等特殊字符的关键词识别问题。
实现代码
use std::collections::HashSet; use std::process; fn main() { // 假设file是读取到的文件内容字符串 let file = "Some text with codeword(123) and Password! here"; // 1. 预处理:过滤掉非字母、数字、空格的字符 let cleaned_content: String = file.chars() .filter(|c| c.is_alphanumeric() || c.is_whitespace()) .collect(); // 2. 定义需要匹配的关键词集合(转为小写,统一匹配逻辑) let target_keywords: HashSet<&str> = ["password", "codeword"].iter().cloned().collect(); // 3. 分割单词并匹配 for word in cleaned_content.split_whitespace() { let lower_word = word.to_lowercase(); if target_keywords.contains(lower_word.as_str()) { println!("{} was found", lower_word); process::exit(0); } } // 如果没有匹配到关键词 println!("No target keywords found"); }
代码说明
- 字符过滤:通过
chars()遍历每个字符,filter保留is_alphanumeric()(字母/数字)或is_whitespace()(空格)的字符,最后collect成新字符串,彻底去除括号、感叹号等特殊字符。 - 关键词集合:用
HashSet存储关键词,相比硬编码的match分支更灵活,后续新增关键词只需修改集合内容即可。 - 匹配逻辑:将每个处理后的单词转为小写,检查是否在关键词集合中,匹配到就打印信息并退出程序。
大文件优化方案
如果扫描的文件体积较大,建议按行读取处理,避免一次性加载全部内容占用过多内存:
use std::fs::File; use std::io::{BufRead, BufReader}; use std::collections::HashSet; use std::process; fn main() -> std::io::Result<()> { let file = File::open("target_file.txt")?; let reader = BufReader::new(file); let target_keywords: HashSet<&str> = ["password", "codeword"].iter().cloned().collect(); for line in reader.lines() { let line = line?; let cleaned_line: String = line.chars() .filter(|c| c.is_alphanumeric() || c.is_whitespace()) .collect(); for word in cleaned_line.split_whitespace() { let lower_word = word.to_lowercase(); if target_keywords.contains(lower_word.as_str()) { println!("{} was found", lower_word); process::exit(0); } } } println!("No target keywords found"); Ok(()) }
内容的提问来源于stack exchange,提问作者user21391428
相关产品推荐
相关产品推荐

