Rust如何用regex替换冒号与@之间的端口,解决\K转义无效问题
问题原因
Rust 官方 regex 库基于 RE2 正则引擎,原生不支持 \K 语法,这是你触发转义序列无效报错的根本原因。
另外你提供的示例代码中 let ip = "172.20.0.3:6379@16379" 行末尾缺少分号,编译时也会触发语法错误,记得补上。
可用实现方案
两种常用实现方式可满足需求,你可以根据习惯选择:
方案1:使用固定长度零宽后发断言(和你原逻辑效果一致)
利用 RE2 支持的固定长度正向回顾断言替代\K的功能,不需要调整替换逻辑:
use regex::Regex; fn main() { let ip = "172.20.0.3:6379@16379"; // (?<=:) 匹配前缀为冒号的位置,后续匹配到@之前的内容即为要替换的端口 let re = Regex::new(r"(?<=:)[^@]+").unwrap(); let new_ip = re.replace(ip, "1234"); println!("{}", new_ip); // 输出 172.20.0.3:1234@16379 }
方案2:使用捕获组(兼容性更强)
通过捕获组保留不需要替换的前后部分,替换时直接复用捕获内容即可:
use regex::Regex; fn main() { let ip = "172.20.0.3:6379@16379"; // 两个捕获组分别保留冒号前的内容、@及之后的内容 let re = Regex::new(r"(.*:)[^@]+(@.*)").unwrap(); // 注意捕获组序号用大括号包裹,避免和后续端口数字混淆 let new_ip = re.replace(ip, "${1}1234${2}"); println!("{}", new_ip); // 输出 172.20.0.3:1234@16379 }
内容的提问来源于stack exchange,提问作者cactus
相关产品推荐
相关产品推荐

