如何用C#正则表达式提取标签间文本并替换为Base64编码?
C# 正则替换Base64标签内容需求
我需要在C#里实现这么个功能:
- 用正则表达式找出文本里夹在
[base64]和[/base64]之间的内容 - 把找到的内容做Base64编码
- 用编码后的结果替换掉原来的标签和里面的内容
举个例子:
输入文本:"[base64] Hi my name [/base64] is Andrew, how are you"
期望输出:"SGkgbXkgbmFtZQ== is Andrew, how are you"
我尝试写的代码
Regex yourRegex = new Regex("(?<=\\[base64])(.*?)(?=\\[\\/base64])"); string result = yourRegex.Replace(Uri.UnescapeDataString(Body)),Helpers.Base64Encode(Convert.ToString(yourRegex))); letterData.body = result;
问题修正与正确代码
你写的代码有几个问题:
Replace方法的参数括号配对错误,而且第二个参数不能直接传正则对象的字符串形式- 要对每个匹配到的内容单独编码,得用
MatchEvaluator委托来处理,不能直接传固定值
正确的代码如下:
// 正则匹配包含标签的整个区块,方便直接替换 Regex base64Regex = new Regex(@"\[base64\](.*?)\[/base64\]", RegexOptions.Singleline); string unescapedBody = Uri.UnescapeDataString(Body); // 用MatchEvaluator处理每个匹配项 string result = base64Regex.Replace(unescapedBody, match => { // 取出标签之间的内容 string content = match.Groups[1].Value; // 调用你的Base64编码方法 return Helpers.Base64Encode(content); }); letterData.body = result;
要点说明
- 正则改成匹配整个
[base64]...[/base64]块,这样替换的时候直接把标签和内容一起换成编码后的字符串,不会残留标签 - 加上
RegexOptions.Singleline参数,确保标签内有换行时也能正确匹配 - 通过
match.Groups[1].Value拿到标签里的原始内容,传给编码方法 - 用
MatchEvaluator委托实现动态替换,每个匹配的内容都会被单独编码
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

