正则表达式-零宽断言实践
业务背景处理JSON字符串KEY值中的特殊字符,VALUE中的字符不受影响。 "L_DOT_BUILD_SUB_DATE": "DOT_SUB" 处理字符串替换一般都是用String的replace系列方法。在这里用replaceAll(),这个方法可以使用正则表达式。 基本概念
解决方案一般的是正则是不行的,可能是功底不够。求助大神之后,要用零宽断言(这名字很拗口,不知道谁起的),详细的概念可以谷歌。简单的说零宽断言表示匹配字符的时候再添加一些定位条件,使匹配更精准。我这里贴出一些关键的用法。 喜欢正则的同学可以参考正则表达式简明参考,可以用正则表达式测试器玩玩。 详细过程需要说明的是零宽断言不支持换行,这个实际测试过,所以在用之前需要把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; } 测试第一次接触到零宽断言,正则是太强大了,可以灵活的解决问题,这里做个笔记留着以后查看。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |