如何在Rust中使用正则表达式移除第n个逗号与下一个逗号间的文本?
Rust正则移除第n个逗号与下一个逗号间文本的问题解决
先搞懂原正则的原理
你用的正则^((?:.*?,){4})[^,]*,(.*)$是这么工作的:
^:锚定字符串开头(?:.*?,):这是个非捕获组,用.*?非贪婪匹配任意字符,直到碰到第一个逗号(连逗号一起匹配);后面加{4}就是重复4次,把前4个逗号及之前的所有内容打包进捕获组1(外层的())[^,]*:匹配第4个逗号之后、下一个逗号之前的所有非逗号字符——这就是你要删掉的部分,:匹配要删的内容后面跟着的那个逗号(.*)$:把剩下的所有内容打包进捕获组2,锚定到字符串结尾
你的代码为啥不好使?
问题有俩:
- 字符串不匹配:你给的测试字符串
"London, City of Westminster, Greater London, England, United Kingdom"只有4个逗号,但原正则是给有5个逗号的字符串(比如示例里带SW1A 2DX的那个)写的,根本匹配不上,自然替换无效 - 替换参数错了:你用了空字符串
"",但正确的应该是用$1$2,把捕获组1和2的内容拼接起来,保留你需要的部分
修正后的代码
情况1:处理带5个逗号的目标字符串(和你示例一致)
use regex::Regex; // 别忘了在Cargo.toml里添加regex依赖 fn main() { let string = "London, City of Westminster, Greater London, England, SW1A 2DX, United Kingdom"; // 移除第4个逗号(从0计数)到下一个逗号的内容 let re = Regex::new(r"^((?:.*?,){4})[^,]*,(.*)$").unwrap(); let result = re.replace(string, "$1$2"); println!("{}", result); // 输出:London, City of Westminster, Greater London, England, United Kingdom }
情况2:处理你给的短字符串(移除最后一段)
如果是针对只有4个逗号的字符串,要移除第3个逗号到下一个逗号的内容,把正则里的{4}改成{3}即可:
use regex::Regex; fn main() { let string = "London, City of Westminster, Greater London, England, United Kingdom"; let re = Regex::new(r"^((?:.*?,){3})[^,]*,(.*)$").unwrap(); let result = re.replace(string, "$1$2"); println!("{}", result); // 输出:London, City of Westminster, Greater London, United Kingdom }
通用思路:移除第n个逗号(从1计数)后的内容
如果要移除第k个逗号(从1开始数)和下一个逗号之间的内容,只需要把正则中的{4}替换成{k-1},替换参数保持$1$2即可。
内容的提问来源于stack exchange,提问作者tenxsoydev
相关产品推荐
相关产品推荐

