如何简化从Rgba格式字符串提取数值的正则实现?
简化Rust中RGBA字符串数值提取的实现方法
方法一:匹配所有数字后取前3个
完全忽略字符串的结构格式,直接提取所有符合要求的数字再截取前三个,逻辑简单且容错性强:
use regex::Regex; fn main() { let text_string = "'Rgba(\n [\n 89,\n 89,\n 89,\n 255,\n ],\n)'"; // 匹配所有1-3位的十进制数字 let num_re = Regex::new(r"\d{1,3}").unwrap(); // 提取前3个匹配到的数字 let rgb_nums: Vec<&str> = num_re.find_iter(text_string) .map(|m| m.as_str()) .take(3) .collect(); let joined_rgb = rgb_nums.join(","); let is_black = joined_rgb.contains("0,0,0"); println!("Result: {}", is_black); println!("Extracted RGB: {}", joined_rgb); }
方法二:用简洁捕获组正则匹配前三个数字
通过\s*匹配任意空白字符(包括换行、空格、制表符),无需精确匹配每行格式,直接捕获前三个RGB数值:
use regex::Regex; fn main() { let text_string = "'Rgba(\n [\n 89,\n 89,\n 89,\n 255,\n ],\n)'"; // 简化正则,忽略空白,捕获前三个数字 let rgba_re = Regex::new(r"'Rgba\(\s*\[\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})").unwrap(); if let Some(caps) = rgba_re.captures(text_string) { let joined_rgb = format!("{},{},{}", &caps[1], &caps[2], &caps[3]); let is_black = joined_rgb.contains("0,0,0"); println!("Result: {}", is_black); println!("Extracted RGB: {}", joined_rgb); } else { println!("no match!"); } }
方法三:结构化解析(非正则方案)
如果RGBA字符串格式固定,可将其转换为合法JSON格式后用serde做结构化解析,鲁棒性更强:
use serde::Deserialize; #[derive(Deserialize)] struct RgbaData { rgba: Vec<u8>, } fn main() { let mut raw_text = "'Rgba(\n [\n 89,\n 89,\n 89,\n 255,\n ],\n)'".to_string(); // 将原始字符串转换为合法JSON结构 raw_text = raw_text.replace("'Rgba(", "{\"rgba\":").replace("),", "]}"); match serde_json::from_str::<RgbaData>(&raw_text) { Ok(data) => { let joined_rgb = format!("{},{},{}", data.rgba[0], data.rgba[1], data.rgba[2]); let is_black = joined_rgb.contains("0,0,0"); println!("Result: {}", is_black); println!("Extracted RGB: {}", joined_rgb); } Err(_) => println!("Failed to parse RGBA data!"), } }
内容的提问来源于stack exchange,提问作者mightymouse2045
相关产品推荐
相关产品推荐

