如何利用JAVA正则表达式轻松替换JSON中的大字段

(一)背景

在软件开发工作中我们经常用JSON来传输数据,根据业务需要不免会在JSON数据中传输比较大的数据,有时传输一个图片数据会达到几百K或者几M,而这些大字段数据在记录日志时,不论是文件日志还是数据库日志,都会造成大量的IO处理,使接口的响应速度大幅下降,同时会增加服务的负载,降低系统的性能。这时我们可以选择不输出这个JSON数据,但往往这样会造成更大的问题,因此我们会想如果只不输出大字段数据,而其他数据正常输出就好了,但从技术上往往不易实现。本文就是给大家提供一种方法,利用JAVA的正则表达式简单方便的替换掉这些大字段,同时不影响其他JSON字段的输出。

(二)正则表达式

我们在这里就不详细介绍正则表达式的用法了,只针对大字段匹配相关的正则表达式进行讲解。

  • 匹配JSON 字段的字段值的正则表达式
    “:\s*\".+?\"”
  • 匹配超过1000的长度的正则表达式
    .{1000,}
  • 结合以上的两个正则表达式
    (?=.{1000,})(:\s*\".+?\")

(三)在JAVA代码中的实现

在这里写一个小例子

 String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
 String pattern = "(?=.{10,})(:\\s*\\\".+?\\\")";
 json = json.replaceAll(pattern, ":\"*\"");
 System.out.println(json);

执行结果

{"name":"*","px":"*"}

怎么回事?和预想不一致,看来事情并不那样的简单,查一下?=的用法,现在这种写法相当来说是两个正则的逻辑与, .{10,}是匹配了一行超过10个字符,而(:\s*".+?")则匹配了json的值项目,也就是说只要这一行超过了10个字符,那么其中的json值都会被替换。知道了原因我们就好办了。把两个正则合为一个正则不就OK了吗。

(四)合并正则表达式

我们改善以下上面的例子,

 String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
 String pattern = "(:\\s*\\\".{10,}?\\\")";
 json = json.replaceAll(pattern, ":\"*\"");
 System.out.println(json);

执行结果

{"name":"*"abcdefg11111111111111111111111111"}

阿来,怎么会这样。他竟然匹配到了。。。

{“name”:“Tom”,“px”:“abcdefg11111111111111111111111111”}

随然还是不对,但离胜利只差一步了,我们在匹配中用的是.{10,},可以匹配任何字符,因此才会造成这种问题,那么我们把正常值中不应该出现的字符排除掉不就可以了吗。

(五)最终结果

 String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
 String pattern = "(:\s*\"[^,\":]{10,}?\")";
 json = json.replaceAll(pattern, ":\"*\"");
 System.out.println(json);

执行结果

{"name":"Tom","px":"*"}

我们终于得到了想要的结果。

(六)所感

其实大家都觉得正则表达式比较高深,但如果我们了解了它的原理,正确的应用到工作中,会得到意想不到的惊喜。

有时由于用法不当可能马上得不到我们想要的结果,但我认为先不要轻易放弃而改变方向,而要分析造成问题的原因并想办法解决,这样对正则表达式的理解和使用能力才能不断提高,希望这篇文章能对大家有所帮助。

到此这篇关于如何利用JAVA正则表达式轻松替换JSON中大字段的文章就介绍到这了,更多相关JAVA正则表达式替换JSON大字段内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成.项目需求是这样的:需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6 实现方法: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s

  • Java 正则表达式学习总结和一些小例子

    从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher. Pattern是一个正则表达式经编译后的表现模式. 在java中,通过适当命名的Pattern类可以容易确定String是否匹配某种模式.模式可以象匹配某个特定的String那样简单

  • 使用正则表达式的格式化与高亮显示json字符串

    json字符串很有用,有时候一些后台接口返回的信息是字符串格式的,可读性很差,这个时候要是有个可以格式化并高亮显示json串的方法那就好多了,下面看看一个正则表达式完成的json字符串的格式化与高亮显示 首先是对输入进行转换,如果是对象则转化为规范的json字符串,不是对象时,先将字符串转化为对象(防止不规范的字符串),然后再次转化为json串.其中json为输入. 复制代码 代码如下: if (typeof json !== 'string') {     json = JSON.string

  • 收集的一些常用java正则表达式

    只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数字:"^\d{n,}$".只能输入m~n位的数字:."^\d{m,n}$"只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$".只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$".只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,

  • Java 正则表达式详解

    如果你不熟悉这个术语,那么"正则表达式"(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式. 正则表达式30分钟入门教程 常用正则表达式 许多语言,包括Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级"搜索-替换"功能.那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification R

  • Java正则表达式入门基础篇(新手必看)

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 大家都知道,正则表达式是一种可以

  • 正则表达式优化JSON字符串的技巧

    json字符串很有用,有时候一些后台接口返回的信息是字符串格式的,可读性很差,这个时候要是有个可以格式化并高亮显示json串的方法那就好多了,下面看看一个正则表达式完成的json字符串的格式化与高亮显示 首先是对输入进行转换,如果是对象则转化为规范的json字符串,不是对象时,先将字符串转化为对象(防止不规范的字符串),然后再次转化为json串.其中json为输入. if (typeof json !== 'string') { json = JSON.stringify(json); } el

  • java正则表达式验证邮箱、电话号码示例

    下面的代码使用正则表达式验证输入格式包括了验证邮箱和验证手机号码 复制代码 代码如下: package com.firewolf.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /**  * 使用正则表达式验证输入格式  * @author liuxing  *  */ public class RegexValidateUtil {  public static void main(String[]

  • JAVA中正则表达式匹配,替换,查找,切割的方法

    正则表达式的查找;主要是用到String类中的split(); String str; str.split();方法中传入按照什么规则截取,返回一个String数组 常见的截取规则: str.split("\\.")按照.来截取 str.split(" ")按照空格截取 str.split("cc+")按照c字符来截取,2个c或以上 str.split((1)\\.+)按照字符串中含有2个字符或以上的地方截取(1)表示分组为1 截取的例子; 按照

  • java正则表达式四种常用的处理方式(匹配、分割、替代、获取)

    java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下 package test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则表达式 * 正则表达式 的用法主要是4种方面的使用 * 匹配,分割,替换,获取. * 用一些简单的符号来代表代码的操作 * @author cyc * */ public class Rex { public static void ma

随机推荐