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

1 篇文章 0 订阅
1 篇文章 0 订阅

(一)背景

在软件开发工作中我们经常用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":"*"}

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

(六)所感

其实大家都觉得正则表达式比较高深,但如果我们了解了它的原理,正确的应用到工作中,会得到意想不到的惊喜。
有时由于用法不当可能马上得不到我们想要的结果,但我认为先不要轻易放弃而改变方向,而要分析造成问题的原因并想办法解决,这样对正则表达式的理解和使用能力才能不断提高,希望这篇文章能对大家有所帮助。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现正则表达式同时替换两个字段,可以使用JavaScript的replace()方法,该方法使用正则表达式来查找和替换字符串中的文字。 首先,需要定义一个正则表达式,包含两个字段。例如,可以实现将所有大小写形式的"hello"和"world"替换为"你好"和"世界"。在正则表达式中可以使用|(或)操作符来连接两个字段,表示匹配任意一个字段。 然后,在replace()方法中传入这个正则表达式,同时传入一个回调函数作为替换字符串的参数。回调函数的参数包含匹配到的文本和每个匹配字符串的位置。在回调函数中,可以根据匹配到的内容来判断应该使用哪个替换字符串。通过返回新替换字符串,就可以完成同时替换两个字段的操作。 下面是一个示例代码,演示如何使用正则表达式同时替换两个字段: ```javascript let str = "Hello World hello world"; let regex = /hello|world/gi; let replaceMap = { "hello": "你好", "world": "世界" }; let newStr = str.replace(regex, function(match) { return replaceMap[match.toLowerCase()]; }); console.log(newStr); // 输出:你好 世界 你好 世界 ``` 在这个示例中,定义了一个正则表达式regex,用来匹配"hello"和"world"字段。同时,定义了一个replaceMap对象,存储了每个字段替换字符串。 在replace()方法中,传入正则表达式和一个回调函数。在回调函数中,使用toLowerCase()方法将匹配内容转换为小写,然后使用replaceMap对象根据匹配内容来获取相应的替换字符串。最后,返回新替换字符串即可。 通过这种方法,就可以方便地同时替换多个字段

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值