最近在项目中遇到一个问题,由于对象的名称属性中可能含有一些特殊字符,可能会造成后面处理的时候与分隔符冲突, 因此解决思路是先转义避免冲突,最后处理完后再反转义回来。 说人话,就是类似urlEncode 和urlDecode 类似的解决方式,但需要自定义要转义的字符。
例如 name = “abc; xyz” , 这里含有了2个干扰符号:分号和空格, 这就会对我后面的处理造成影响,因此先转义成 name=”abc_03_00xyz”, 再处理就没问题了。 处理完后再还原成name=”abc; xyz”。
如果是一个一个的replace, 会显得有点愚钝。 在这里我给各位推荐一个使用正则表达式批量处理的写法。
首先定义替换的码表字典:
var dict = new Dictionary<string, string> { { " ", "_00" }, { "$", "_01" }, { ".", "_02" }, { ";", "_03" }, { "/", "_04" } };
然后, 定义正则的pattern
var keys = dict.Keys.Select(p => p == " " ? p : "\\" + p);// 除了空格, 其他都要加斜杠转义 Regex regexEncoder = new Regex(@"([" + string.Join("", keys) + "])");
接着, 使用正则的替换函数, 不过需要用到MatchEvaluator委托
var text = "abc.def$xyz nb;ppp/qqq"; var actualEncoded = regexEncoder.Replace(text, m => //MatchEvaluator委托 { var key = m.Value; return dict[key]; });
运行后可以得到结果
// result : abc_02def_01xyz_00nb_03ppp_04qqq
以上就是一次性多位转义的过程。
顺便把反转义的代码也贴出来,供参考:
Regex regexDecoder = new Regex(@"(" + string.Join("|", dict.Values) + ")"); var actualDecoded = regexDecoder.Replace(actualEncoded, m => { var value = m.Value; return dict.First(p => p.Value == value).Key; });
思路是一样的, 需要注意的是正则的写法稍微有变化。 转义的正则是 ([abc]) , 反转义的正则是(word1|word2|word3)。
以上的原理是用到了正则的匹配(Match)规则, 针对每个匹配命中的结果,在委托中决定替换的内容。由于正则可以一次性将多个匹配识别出来,因此就可以一次性实现多位替换了。
以上就是实现字符串多位批量替换的过程和解释。 如果您觉得有帮助的话,不妨留下您的评论,谢谢!