专栏首页架构师进阶正则表达式-零宽断言实践

正则表达式-零宽断言实践

业务背景

处理JSON字符串KEY值中的特殊字符,VALUE中的字符不受影响。 如下所示,替换KEY中的_DOT_为点._SUB__

"L_DOT_BUILD_SUB_DATE": "DOT_SUB"

处理字符串替换一般都是用String的replace系列方法。在这里用replaceAll(),这个方法可以使用正则表达式。

基本概念

维基百科 正则表达式,又称正规表示式、正規表示法、正規運算式、規則運算式、常規表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器裡,正則表达式通常被用来检索、替换那些符合某个模式的文本。

解决方案

一般的是正则是不行的,可能是功底不够。求助大神之后,要用零宽断言(这名字很拗口,不知道谁起的),详细的概念可以谷歌。简单的说零宽断言表示匹配字符的时候再添加一些定位条件,使匹配更精准。我这里贴出一些关键的用法。

喜欢正则的同学可以参考正则表达式简明参考,可以用正则表达式测试器玩玩。

详细过程

需要说明的是零宽断言不支持换行,这个实际测试过,所以在用之前需要把JSON字符串格式化,这里推荐工具Gson,详细代码如下。

    public static String JSONFormatter(String uglyJSONString) {
        Gson gson3 = new GsonBuilder().setPrettyPrinting().create();
        com.google.gson.JsonParser jp = new com.google.gson.JsonParser();
        JsonElement je = jp.parse(uglyJSONString);
        String prettyJsonStr2 = gson3.toJson(je);
        return prettyJsonStr2;
    }

直接贴出解决代码

    public static String parseDotSub(String jsonStr) {
        //格式化JSON,使JSON中的键值对换行
        jsonStr = JSONFormatter(jsonStr);
        //解析键值对,不替换值中的字符,只替换冒号之前KEY中的字符
        String regexDot = "_DOT_(?=.*:)";
        String regexSub = "_SUB_(?=.*:)";
        jsonStr = jsonStr.replaceAll(regexDot, CONSTANT_DOT);
        jsonStr = jsonStr.replaceAll(regexSub, CONSTANT_SUB);
        return jsonStr;
    }

测试

扩展

问题

利用零宽断言还解决了另外一个问题。字母和数字之间的减号,数字中间的点(不包括字母和数字之间的点)都替换为冒号。

    public static String parseToColon(String jsonStr) {
        //以数字结尾的前面带-的字符
        String regexSub = "-(?=\\d+)";
        jsonStr = jsonStr.replaceAll(regexSub, CONSTANT_COLON);
        //以数字开始后面带点的字符
        String regexDot = "(?<=\\d+)\\.";
        jsonStr = jsonStr.replaceAll(regexDot, CONSTANT_COLON);
        return jsonStr;
    }

测试

第一次接触到零宽断言,正则是太强大了,可以灵活的解决问题,这里做个笔记留着以后查看。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript第二十弹——ES6(9)Generator的语法糖Async

    Hello,小伙伴们~生活那么苦,今天就给大家带来点甜的,还记得昨天大明湖畔的Generator嘛,那个*那个yield是不是很烦呢,那我们今天就送大家一颗语法...

    萌兔IT
  • JavaScript入门(1)

    Hello小可爱们,今天我们又要回到学习主题咯,前面学习了HTML和CSS的用法,今天我们就要为Web页面注入生命啦,那就是JavaScript...

    萌兔IT
  • HTML5上传图片,后台使用java

    <script src="${base_path}/view/html/js/flexible.js"></script> <script s...

    用户5640963
  • 【jQuery进阶】子菜单插件Slight Submenu

    兼容所有浏览器(记住,jQuery的2 *及以上不支持<IE9,如果您使用的是,对于那些旧的浏览器不支持)

    用户5640963
  • tomcat同时部署两个项目的问题

    严重: Exception sending context initialized event to listener instance of class or...

    用户5640963
  • JavaScript入门总结——第二弹学习对象,分清__proto__、prototype

    Hello小伙伴们,我又来啦,今天我们要继续我们JavaScript的入门总结第二弹!!!

    萌兔IT
  • java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错

    错误的项目是没有maven dependencies这一项的,需要add,选择add按钮,

    用户5640963
  • Vue系列(二)——Vue之模板语法

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    萌兔IT
  • Vue系列(七)—— 从零开始搭建基于Webpack的Vue项目

    Hello小伙伴们,Vue也写了好几篇了,今天说点更实用的,今天我们就要来聊聊怎样能够快速搭建一个Vue的程序呢?这里我们可以基于Webpack去搭建,下面我们...

    萌兔IT
  • JavaScript第二十一弹——ES6(10)JavaScript也有Class啦

    Hello小伙伴们,今天就不继续前面的异步话题了,今天带来的是Class,小伙伴们不禁会问了,诶?前面不是说了JavaScript没有class的概念么,这怎么...

    萌兔IT

扫码关注云+社区

领取腾讯云代金券