首页 > 其他分享 >使用正则表达式实现字符串的多位转义

使用正则表达式实现字符串的多位转义

时间:2022-08-25 11:47:03浏览次数:69  
标签:Regex abc 正则表达式 转义 var 正则 dict 字符串

 

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

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

标签:Regex,abc,正则表达式,转义,var,正则,dict,字符串
From: https://www.cnblogs.com/huwz/p/regex_string_replacer.html

相关文章

  • rm 配合正则表达式使用
    ls|grep-E"^[0-9]+"|xargsrm-r正则表达式含义为,从当前目录的所有文件名的起始字符进行匹配,要求数字至少出现一次。正则表达式:https://www.runoob.com/regexp/re......
  • Kotlin中的字符串模板
    Kotlin字符串模板支持在字符串的引号内使用变量,以及添加任何表达式,会把表达式的结果作为字符串的一部分,实现java字符串拼接的效果例如:运行结果: ......
  • 正则表达式
    转自:学无止境(http://www.cnblogs.com/xiashengwang/p/3988009.html)下面的内容来自于微软的官网。“正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串。该......
  • API基础正则表达式8月23日
    API基础第二天:回顾:String:Strings=newString("hello");String常用方法:length():获取长度trim():去掉两边空白toUpperCase()和toLowerCase():转大写/转小写st......
  • 常用正则表达式
    常用正则表达式一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多......
  • Python自学教程5-字符串有哪些常用操作
    任何编程语言,不管是Python、Java还是Golang,字符串都是最重要的一种数据类型。但是字符串的操作又很多,初学者经常毫无头绪,不知道从哪儿学起,也不知道哪些操作用得多,今天......
  • C++ 11 数字转字符串新功能
    //头文件<string>stringto_string(intval);stringto_string(longval);stringto_string(longlongval);stringto_string(unsignedval);stringto_string(uns......
  • PHP检测一个字符串中是否包含另外一个字符或字符串
    编写程序的时候,经常要处理字符串,最基本就是字符串的查找,您可能需要检查字符串是否包含特定的字符或子字符串,因为您可能必须对该子字符串或字符执行某些操作。我们将使用......
  • 正则表达式
    正则表达式语法普通字符对大小写字母、数字、标点符号的匹配。表达式说明[abc]匹配[]中的所有字符[^abc]匹配除了[]中的所有字符[a-c]匹配区间内的......
  • 通过字符串动态实现效果
    动态导包import('')动态获取属性__getattribute__和getattrclassA:a=1def__init__(self):self.b=2@staticmethoddefgetname():......