java使用正则提取数据

news2024/12/23 0:37:42

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

需要对一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http协议与tomcat

目录 引言 抓包 fiddler的基本使用及设置 HTTP请求 请求首行请求头空行正文 请求的首行方法URL版本号 ​编辑 响应首行响应头空行正文 响应的首行版本号状态码 URL(网址) url基本格式 urlencode 常见方法 get和post区别 认识请求"报头"(header) Host Content-Len…

Kubernetes的容器批量调度引擎 Volcano

一个用于高性能工作负载场景下基于Kubernetes的容器批量调度引擎 Volcano是在Kubernetes上运行高性能工作负载的容器批量计算引擎。 它提供了Kubernetes目前缺少的一套机制&#xff0c;这些机制通常是许多高性能 工作负载所必需的&#xff0c;包括&#xff1a; - 机器学习/深度…

某金融机构在数据安全及等保合规背景下的网络安全规划项目案例

前言 **近年来网络入侵、信息泄露以及网络病毒等事件频发&#xff0c;国家层面陆续出台多部数据安全相关法律法规&#xff0c;金融行业作为国家强监管的重点行业&#xff0c;参照上层法律法规起草发布了各类相关行业标准和规范。另外&#xff0c;结合笔者所在公司基础架构和信…

国产芯片ZT1826亮相IOTE展 以物联网技术助力行业数字化转型

9月20日&#xff0c;备受物联网行业瞩目的IOTE 2023第20届国际物联网展&#xff0c;在深圳宝安国际会展中心盛大开幕&#xff01;本届展会为期三天&#xff0c;从9月20日到22日&#xff0c;以“IoT构建数字经济底座”为主题&#xff0c;汇聚了全球超600家参展企业&#xff0c;参…

计算机毕业设计 智慧养老中心管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

简单线性回归(Simple Linear Regression)

简单线性回归(Simple Linear Regression) 简单线性回归(Simple Linear Regression)简介理解数据数据处理读取数据数据预览数据探索数据统计信息数据类型查看数据的直方图通过散点图查看数据的相关关系相关系数建立模型创建训练数据和测试数据建立简单线性回归模型查看回归方…

甜型葡萄酒取决的因素有哪些?

许多葡萄酒爱好者对干葡萄酒有明显的偏好&#xff0c;其中一些人甚至不喜欢甜葡萄酒&#xff0c;但这种拒绝意味着他们永远不会知道一些世界上最好的葡萄酒&#xff0c;如果你想了解更多关于甜酒的知识&#xff0c;你来对地方了。来自云仓酒庄雷盛红酒分享&#xff0c;云仓酒庄…

【2023研电赛】商业计划书赛道—总决赛二等奖:高安全性刷掌识别技术产业化

本文为2023年第十八届中国研究生电子设计竞赛商业计划赛道二等奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&a…

全球第4大操作系统(鸿蒙)的软件后缀.hap

system exe 2022-12-01 04:38:38 首页 > 操作系统 145|0条评论 鸿蒙OS兼容已有安卓程序&#xff1a;这事不稀奇。 其实一个系统兼容另外系统的可执行程序并非新鲜事&#xff0c;比如linux下的wine和crossover可以兼容许多win系统的.exe程序。 作为回应&#xff0c;Wind…

如何避免过度优化?(掌握这些技巧,让你更优雅地优化你的网站)

在网络营销中&#xff0c;优化对于网站的重要性不言而喻。然而&#xff0c;有时候优化会让人们走上一条错误的道路——过度优化。过度优化会导致网站被惩罚&#xff0c;甚至被从搜索结果中彻底剔除。本文将详细介绍如何避免过度优化&#xff0c;从而保证网站的可持续发展。蘑菇…

VS Code 中使用Git实践,学会了效率翻倍!

本文来一起学习如何在 VS Code 中进行常见的 Git 可视化操作&#xff01; 前置工作 在介绍如何在 VS Code 中使用 Git 之前&#xff0c;先来介绍一个强悍的 VS Code 插件&#xff1a;Git Extension Pack&#xff0c;它旨在提供一组常用的 Git 工具和功能&#xff0c;以便更方…

四,立方体贴图

Pbr的间接光用到立方体贴图&#xff0c;所以&#xff0c;先用shader进行立方体贴图。 立方体贴图很简单&#xff0c;就是用方向向量&#xff08;不一定是单位向量&#xff09;采样cubeMap的颜色。 也就是在片元着色器中传递。 "float x outPos.r;\n" "float y…

前端制作

使用float: left将格子左浮动。 设置格子背景颜色&#xff0c;字体颜色&#xff0c;鼠标放上去后的字体颜色和背景颜色 <style>.title {width: 100%;overflow: hidden;}.title-topic a { /*以下元素应用于topic*/float: left; /*左浮动&#xff0c;让12个格子在…

导数差分近似公式总结

导数差分近似公式总结 生活一路顺风 睿雯 一阶近似 向前差分 -111-21-13-311-46-41 向后差分 -111-21-13-311-46-41 二阶近似 向前差分 -3412-54-1-518-2414-33-1426-2411-2 向后差分 1-43-14-523-1424-185-211-2426-143 中心差分 -1011-21-120-211-46-41 四阶近似 中…

RabbitMQ工作模式——Topics模式

1.Topics通配符模式 *是一个单词&#xff0c;#是0到多个单词 Topics模式生产者代码 public class Producer_Topic {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//…

Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)

整理逻辑思路&#xff1a; //【业务逻辑】这个脚本用来1.控制物体移动旋转&#xff08;WASD&#xff09;、 2.发射子弹&#xff08;空格键&#xff09; //【程序逻辑2】 首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数 3.克隆子弹 4.让克隆的子弹往前跑 搭…

进销存ERP系统源码 基于springboot+vue开发

进销存ERP系统源码 基于springbootvue开发 技术框架 Springboot 2.2.2.RELEASEMyBatis-plus 3.4.2Spring-session-data-redis 2.2.0.RELEASEHuTool 5.7.17Lombok 1.18.10EasyExcel 2.2.10 JDK 1.8Mysql 5.7.18Redis 4.0.8 项目介绍&#xff1a; ERP基于SpringBoot框架&…

智能合约漏洞案例,Palmswap 90 万美元漏洞分析

智能合约漏洞案例&#xff0c;Palmswap 90 万美元漏洞分析 据Safful安全团队情报&#xff0c;2023 年 7 月 25 日&#xff0c;BSC 链上的 Palmswap 项目遭到攻击&#xff0c;攻击者获利超 90 万美元。Safful安全团队介入分析后将结果分享如下&#xff1a; 相关信息 Palmswap …

基于 CPU 在docker 中部署PaddleOCR

1. 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.0注&#xff1a;写该文章时&#xff0c;Paddle 最新版本为2.5.1&#xff0c;但是在实际安装中会出现与 PaddleHub 2.3.1版本的冲突&#xff0c;故采用2.4.0版本 2. 构建并进入容器 docker run --name…

conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题

上一篇博客《conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败》解决了conan 1.60.0交叉编译boost/1.80.1的问题后&#xff0c;我继续交叉编译openssl/3.1.2时又报错了 conan install openssl/3.1.2 -pr:h aarch64-linux-gnu.…