最近在项目中遇到一个问题,由于对象的名称属性中可能含有一些特殊字符,可能会造成后面处理的时候与分隔符冲突, 因此解决思路是先转义避免冲突,最后处理完后再反转义回来。 说人话,就是类似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)规则, 针对每个匹配命中的结果,在委托中决定替换的内容。由于正则可以一次性将多个匹配识别出来,因此就可以一次性实现多位替换了。

以上就是实现字符串多位批量替换的过程和解释。 如果您觉得有帮助的话,不妨留下您的评论,谢谢!

posted on 2022-08-25 11:35  Weizheng  阅读(183)  评论(0编辑  收藏  举报