java使用正则提取数据

2023-09-22 10:44:01

一、正则提取文本指定数据

需要对一个json结构做数据的提取,提取label和value的值,组成新的结构,西瓜:0、苹果:1、草莓:2
原始json字符串如下格式

[
  {
    "label": "西瓜",
    "value": 0
  },
  {
    "label": "苹果",
    "value": 1
  },
  {
    "label": "草莓",
    "value": 2
  },
  {
    "label": "柚子",
    "value": 3
  },
  {
    "label": "葡萄",
    "value": 4
  }
]

正则表达式

"label":\s"(.*)",\s+"value":\s(\d+)

结合正则的分组模式$1、$2可以提取,但是在实际java开发中,字符串格式发生了变化,字符串多了空格和换行等,因此需要再完善正则表达式。

该json字符串出现的变种如下:

变种1

[{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"label":"柚子","value":3},{"label":"葡萄","value":4}]

变种2

[  {    "label": "西瓜",    "value": 0  },  {    "label": "苹果",    "value": 1  },  {    "label": "草莓",    "value": 2  },  {    "label": "柚子",    "value": 3  },  {    "label": "葡萄",    "value": 4  }]

新的正则写法

"label":"(.{1,2})","value":(\d{1,2})

只能匹配变种1,原始json字符串和变种2不适应,
最终调试改为如下正则写法,三种情况的json字符串都可以匹配。

"label":\s?"(.{1,2})",\s*"value":\s?(\d{1,2})

二、正则表达式详解

三、java正则表达式提取结果

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


@Slf4j
public class RegularExpressionTest {

    /**
     * 提取label和value的值
     * <p>
     * [
     * {
     * "label": "西瓜",
     * "value": 0
     * },
     * {
     * "label": "苹果",
     * "value": 1
     * },
     * {
     * "label": "草莓",
     * "value": 2
     * },
     * {
     * "label": "柚子",
     * "value": 3
     * },
     * {
     * "label": "葡萄",
     * "value": 4
     * }
     * ]
     * <p>
     * 因为json字符串在不同的工具复制来复制去,出现不同的格式,例如空格和换行,这里列举在实际处理中遇到的2终变种格式
     * <p>
     * [{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"label":"柚子","value":3},{"label":"葡萄","value":4}]
     * <p>
     * [  {    "label": "西瓜",    "value": 0  },  {    "label": "苹果",    "value": 1  },  {    "label": "草莓",    "value": 2  },  {    "label": "柚子",    "value": 3  },  {    "label": "葡萄",    "value": 4  }]
     *
     * @param
     * @return void
     * @author fangyunhe
     * @time 2023/9/20 10:40
     **/
    @Test
    public void test() {
        String jsonStr = "[\n" +
                "  {\n" +
                "    \"label\": \"西瓜\",\n" +
                "    \"value\": 0\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"苹果\",\n" +
                "    \"value\": 1\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"草莓\",\n" +
                "    \"value\": 2\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"柚子\",\n" +
                "    \"value\": 3\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"葡萄\",\n" +
                "    \"value\": 4\n" +
                "  }\n" +
                "]";
        //String jsonStr = "[{\"label\":\"西瓜\",\"value\":0},{\"label\":\"苹果\",\"value\":1},{\"label\":\"草莓\",\"value\":2},{\"label\":\"柚子\",\"value\":3},{\"label\":\"葡萄\",\"value\":4}]";
        //String jsonStr = "[  {    \"label\": \"西瓜\",    \"value\": 0  },  {    \"label\": \"苹果\",    \"value\": 1  },  {    \"label\": \"草莓\",    \"value\": 2  },  {    \"label\": \"柚子\",    \"value\": 3  },  {    \"label\": \"葡萄\",    \"value\": 4  }]";
        String patternStr = "\"label\":\\s?\"(.{1,2})\",\\s*\"value\":\\s?(\\d{1,2})";
        Pattern pattern = Pattern.compile(patternStr);
        Matcher matcher = pattern.matcher(jsonStr);
        while (matcher.find()) {
            log.info(matcher.group(1) + ":" + matcher.group(2));
        }      
    }
}

执行结果

17:08:50.684 [main] INFO  demo.test.RegularExpressionTest - 西瓜:0
17:08:50.890 [main] INFO  demo.test.RegularExpressionTest - 苹果:1
17:08:51.453 [main] INFO  demo.test.RegularExpressionTest - 草莓:2
17:08:51.838 [main] INFO  demo.test.RegularExpressionTest - 柚子:3
17:08:52.406 [main] INFO  demo.test.RegularExpressionTest - 葡萄:4

更多推荐

「聊设计模式」之 设计模式的前世今生

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!目录:一、什么是设计模式设计模式的定义设计模式的作用二、设计模式的发展历程设计模式的起源设计模式的发展阶段三、设计模式的分类创建型模式结构型模式行为型模式四、常用的设计模式工厂模式单例模式装饰器模式代理模

【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城

在b站听了袁老师的开发课,做了一点笔记。01-项目环境搭建_哔哩哔哩_bilibili基于springboot框架的电脑商城项目(一)_springboot商城项目_失重外太空.的博客-CSDN博客项目环境搭建1.项目分析1.项目功能:登录、注册、热销商品、用户管理(密码、个人信息、头像、收货地址)、购物车(展示、增加

Promise的链式调用

catch方法.catch(onRejected)=.then(null,onRejected)链式调用then方法必定会返回一个新的Promise可理解为后续处理也是一个任务新任务的状态取决于后续处理:若没有相关的后续处理,新任务的状态和前任务一致,数据为前任务的数据若有后续处理但还未执行,新任务挂起。若后续处理执行

C++笔记之文档术语——将可调用对象作为函数参数

C++笔记之文档术语——将可调用对象作为函数参数相关博文:C++笔记之函数对象functors与可调用对象文章目录C++笔记之文档术语——将可调用对象作为函数参数1.在函数参数中传递可调用对象2.‘在参数中传入可调用对象’和‘将可调用对象作为函数参数’哪个描述更加专业官方?3."将可调用对象作为函数参数"是不是和‘回调

【Java 基础篇】Java网络编程基础知识详解

网络编程是现代软件开发中不可或缺的一部分,它使我们能够在不同的计算机之间实现数据传输和通信。Java作为一种强大的编程语言,提供了丰富的网络编程库,使开发者能够轻松地创建网络应用程序。本文将介绍Java网络编程的基础知识,面向初学者,详细讨论网络通信的概念、Socket编程、服务器和客户端编程等内容。1.网络通信的基本

二刷力扣--栈和队列

栈和队列栈和队列基础(Python)栈一种先进后出,队列先进后出。Python中可以用list实现栈,用append()模拟入栈,用pop()模拟出栈。也可以用list实现队列,但是效率较低,一般用collections.deque模拟(双端)队列。5.数据结构—Python3.11.5文档使用list进行栈的操作st

git 命令总结

git初始化gitinit添加文件gitadd<file>添加注释gitcommit-m"注释"重新提交覆盖上一次提交内容gitcommit--amend查看当前所处状态gitstatus克隆仓库gitclone<remoteURL>关联远程仓库gitremoteadd<remote><remoteURL>查看git对

【Java 基础篇】Java TCP通信详解

TCP(TransmissionControlProtocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景,如文件传输、网页浏览等。本文将详细介绍Java中如何使用TCP协议进行网络通信,包括TCP套接字、服务器和客户端的创建、数

麒麟信安的2023世界计算大会时刻

9月15至16日,由工业和信息化部、湖南省人民政府主办的2023世界计算大会在长沙隆重举行。麒麟信安连续五年亮相世界计算大会,本届大会麒麟信安作为计算产业的重要建设者、国家新一代自主安全计算系统产业集群内核心企业,在展览展示、主题演讲、工控操作系统创新研究院揭牌仪式等多环节中深度参与。大会以“计算万物湘约未来——计算产

Leetcode算法入门与数组丨3. 数组基础

文章目录前言1数组简介2数组的基本操作2.1访问元素2.2查找元素2.3插入元素2.4改变元素2.5删除元素3总结task03task04前言Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记这篇博客是一个入门型的文章,主要是自己学习的一个记录。内容会参考这篇笔记(很详细):LeetCode算法笔

Python中的3D矩阵操作

迷途小书童读完需要6分钟速读仅需2分钟3D矩阵又称为立体矩阵,是指一个具有三个维度的矩阵结构。相比二维矩阵,它增加了一个深度维度。在3D矩阵中,第一个维度表示行数,第二个维度表示列数,第三个维度表示层数或深度,可以想象成一个多层的立方体结构。三维矩阵通常也称为NxNxN矩阵,在计算机视觉、医学成像、深度学习、增强现实等

热文推荐