java解析请求的字符串参数Content-Disposition: form-data;和拼接的键值对
项目场景:
获取到http请求的参数,已经被字符串接收了,需求是需要从字符串中解析出来。
一种情况是:Content-Disposition: form-data; name="userCode"
另一种是:key1=value1&key2=value2&key3=value3,&拼接的键值对
解析参数
一、解析Content-Disposition: form-data;
需要解析的字符串
--38e67491-2794-4b83-a1d2-e2667bce6501
Content-Disposition: form-data; name="endDate"
Content-Length: 192024-07-02 00:02:26
--38e67491-2794-4b83-a1d2-e2667bce6501
Content-Disposition: form-data; name="type"
Content-Length: 4xqqk
--38e67491-2794-4b83-a1d2-e2667bce6501--
示例:
public class TestService {public static void main(String[] args) {String requestParamStr = "--38e67491-2794-4b83-a1d2-e2667bce6501\n"+"Content-Disposition: form-data; name=\"endDate\""+"\nContent-Length: 19"+"\n\n"+"2024-07-02 00:02:26"+"\n--38e67491-2794-4b83-a1d2-e2667bce6501\n"+"Content-Disposition: form-data; name=\"type\""+"\nContent-Length: 4"+"\n\n"+"xqqk\n"+"--38e67491-2794-4b83-a1d2-e2667bce6501--";if(requestParamStr.startsWith("--") && requestParamStr.contains("Content-Length")){String[] param = requestParamStr.split("--[a-zA-Z0-9]+\\-");for(String keyvalue:param){if(keyvalue.contains("Content-Disposition")){String key = parseKey(keyvalue);String value = parseValue(keyvalue);System.out.println("key:"+key+",value:"+value);}}}}/*** 正则表达式匹配name参数*/private static String parseKey(String contentDisposition) {String pattern = ".*name=\"([^\"]+)\".*";java.util.regex.Pattern r = java.util.regex.Pattern.compile(pattern);java.util.regex.Matcher m = r.matcher(contentDisposition);if (m.find()) {return m.group(1);}return null;}/*** 正则表达式匹配value参数*/private static String parseValue(String contentDisposition) {String pattern = "\\n\\s*\\n([^\\n]+)";java.util.regex.Pattern r = java.util.regex.Pattern.compile(pattern);java.util.regex.Matcher m = r.matcher(contentDisposition);if (m.find()) {return m.group(1).replaceAll("\r", "").replaceAll("\n", "");}return null;}
}
正则表达式"\\n\\s*\\n([^\\n]+)"的含义是:
\\n\\s*\\n:匹配一个空行,即两个连续的换行符,中间可以有任意空白字符。
([^\\n]+):匹配空行之后的非换行符字符序列,并将其捕获在一个组中。
请注意,这个解决方案假设“空行”是由两个连续的换行符定义的,并且在文本中不会有额外的空白行。如果文本中可能有多个空行,或者空行前后有额外的空白字符,您可能需要调整正则表达式以适应这些情况。
输出:
key:endDate,value:2024-07-02 00:02:26
key:type,value:xqqk
二、解析&拼接的键值对
需要解析的字符串
key1=value1&key2=&key3=value3
示例:
public class TestService {public static void main(String[] args) {String input1 = "key1=value1&key2=&key3=value3";String input2 = "key1=value1&key2=value2&key3=value3";String input3 = "key1=&key2=&key3=";String input4 = "key1=value1&key2=value2&key3"; // 不符合规则,因为键值对中缺少 '='String input5 = "key1=value1&key2=value2&key3=&value4"; // 不符合规则,因为 'value4' 不是一个有效的键值对System.out.println(isValidKeyValuePairs(input1)); // 输出: trueSystem.out.println(isValidKeyValuePairs(input2)); // 输出: trueSystem.out.println(isValidKeyValuePairs(input3)); // 输出: trueSystem.out.println(isValidKeyValuePairs(input4)); // 输出: falseSystem.out.println(isValidKeyValuePairs(input5)); // 输出: falseboolean isCorrect = isValidKeyValuePairs(input1);if(isCorrect){String[] param = input1.split("&");for(String keyvalue:param){String[] pair = keyvalue.split("=",2);if(pair.length==2){System.out.println("key:"+pair[0]+",value:"+pair[1]);}}}}/*** 匹配键值对,键和值可以包含除了 & 以外的任何字符* 值可以为空,键和值之间通过 = 连接,键值对之间通过 & 连接*/private static boolean isValidKeyValuePairs(String input) {// 例如: key=value&key2=value2String pattern = "([^&=&]+=[^&=&]*)(&([^&=&]+=[^&=&]*))*";return input.matches(pattern);}}
这个正则表达式解释如下:
([^&=&]+) 匹配不包含'&', '=', 或者 '&' 的一个或多个字符,这代表键。
= 字面匹配。
[^&=&]* 匹配零个或多个不包含 '&', '=', 或者 '&' 的字符,这代表值。
(&([^&=&]+=[^&=&]*))* 匹配零个或多个以 '&' 开始,后面跟着键值对的子串。
输出:
true
true
true
false
false
key:key1,value:value1
key:key2,value:
key:key3,value:value3
相关文章:
java解析请求的字符串参数Content-Disposition: form-data;和拼接的键值对
项目场景: 获取到http请求的参数,已经被字符串接收了,需求是需要从字符串中解析出来。 一种情况是:Content-Disposition: form-data; name"userCode" 另一种是:key1value1&key2value2&key3value3…...
活动回顾|2024 MongoDB Developer Day圆满收官!
上周六,MongoDB专家与团队在深圳 与90位开发者度过了充实一日 至此,2024 MongoDB Developer Day 北上深三站之行全部圆满结束! 一文回顾本次活动全程与精彩影像! MongoDB Developer Day 专为开发者定制的技术盛宴 全天沉浸动手实…...
MySQL资源组的使用方法
MySQL支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性允许控制其资源,以启用或限制组中线程的资源消耗。DBA可以针对不同的工作负载适当地修改这些属性。 目前,CPU时间是一…...
python--实验7 函数(1)
知识点 函数的定义与调用 函数分类:内置函数和自定义函数。函数定义:使用def关键字定义函数,包括函数名、参数列表和函数体。注意: (1)即使该函数不需要接收任何参数,也必须保留一对空的圆括号…...
【力扣】数组中的第K个最大元素
一、题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,…...
WTM的项目中EFCore如何适配人大金仓数据库
一、WTM是什么 WalkingTec.Mvvm框架(简称WTM)最早开发与2013年,基于Asp.net MVC3 和 最早的Entity Framework, 当初主要是为了解决公司内部开发效率低,代码风格不统一的问题。2017年9月,将代码移植到了.Net Core上&…...
互联网3.0时代的变革者:华贝甄选大模型创新之道
在当今竞争激烈的商业世界中,华贝甄选犹如一颗璀璨的明星,闪耀着独特的光芒。 华贝甄选始终将技术创新与研发视为发展的核心驱动力。拥有先进的研发团队和一流设施,积极探索人工智能、大数据、区块链等前沿技术,为用户提供高性能…...
Tomcat的安全配置
1、生产环境优化 2、部分漏洞修复 转载自风险评估:Tomcat的安全配置,Tomcat安全基线检查加固-CSDN博客...
[笔记] 卷积 - 01 变速箱需要放置多少个加速度传感器?
1.讨论范围 本帖主要对卷积运算的过程和物理意义进行基本的展开,不涉及具体的验算过程。 最终所要达成的目标是,能够自然地判断某种物理现象或者某个测量目标是否与卷积运算有关,以及如何进行测量,搜集数据,调用三方…...
Maya崩溃闪退常见原因及解决方案
Autodesk Maya 是一款功能强大的 3D 计算机图形程序,被电影、游戏和建筑等各个领域的设计师广泛使用。然而,Maya 就像任何其他软件一样可能会发生崩溃问题。在前文中,小编给大家介绍了3ds Max使用V-Ray渲染时的崩溃闪退解决方案: …...
编码与梦想:我的CSDN创作5周年
五年前的今天,我带着对技术的热爱和对知识的渴望,踏上了CSDN的创作之旅。这个平台对于我来说,不仅仅是一个分享和学习的场所,更是我成长和自我实现的见证。 机缘 记得那时,我正为了一个编程难题而苦恼,偶…...
Vue2 基础十Vuex
代码下载 Vuex 概述 组件之间共享数据的方式: 父组件向子组件传值,是以属性的形式绑定值到子组件(v-bind),然后子组件用属性props接收。子组件向父组件传值,子组件用 $emit() 自定义事件,父组…...
【大模型】驾驭未知领域:LLM如何处理域外或无意义的提示
驾驭未知领域:LLM如何处理域外或无意义的提示 引言一、概念解析1.1 域外提示1.2 无意义提示二、LLM处理策略2.1 上下文推断2.2 缺省回答2.3 模糊处理2.4 求助于常识三、实例对比3.1 域外提示实例3.2 无意义提示实例四、挑战与局限五、未来展望六、结语附录:术语解释与参考资料…...
Docker容器 为MySQL创建新用户和授权
当您需要为 MySQL 数据库创建一个新用户并配置其访问权限时,可以按照以下步骤操作。我将创建一个名为 newuser 的新用户,并为其授予在任何主机上访问所有数据库的权限。 创建新用户和授权步骤: 登录到 MySQL 服务器 首先,使用具有…...
openssh9.8p1更新 修复漏洞(CVE-2024-6387)
2024 年 7 月,互联网公开披露了一个 OpenSSH 的远程代码执行漏洞(CVE-2024-6387)。鉴于该漏洞虽然利用较为困难但危害较大,建议所有使用受影响的企业尽快修复该漏洞。 centos7 为例 yum -y install gcc make openssl-devel zlib…...
超市收银系统源码
今天给大家分享一套线上线下打通的收银系统,安卓/win双端线下收银台,可DIY、多模板的三端线上小程序商城,除此之外ERP进销存管理、商品管理、会员营销都很完善。 重点是系统支持OEM贴牌独立部署和全开源源码,非常适合一些正在寻找…...
word 使用手册
word 文档中如何将下行的指定文字退格到上行中 就像是这样的 编号:111 密码:222 编号:123 密码:321 编号:124 密码:331 变成 编号:111密码:222 编号:123密码࿱…...
vue学习day03-指令修饰符、v-bind对于样式控制的增强、v-model应用于其他表单元素
7、指令修饰符 (1)概念: 通过“.”指明一些指令后缀,不同后缀封装了不同的处理操作->简化代码 (2)按键修饰符 keyup.enter->键盘回车监听 (3)v-model修饰符 v-model.tri…...
JRE、JVM、JDK分别是什么。
JDK JDK的英文全称是Java Development Kit。JDK是用于制作程序和Java应用程序的软件开发环境。JDK 是 Java 开发工具包,它是 Java 开发者用来编写、编译、调试和运行 Java 程序的集合。JDK 包括了 Java 编译器(javac)、Java 运行时环境&…...
台灯护眼是真的吗?台灯怎么选对眼睛好?一文带你读懂!
近视问题,这一现代社会的“视力杀手”,正悄然影响着越来越多的人群,尤其是青少年群体。长时间面对电子屏幕和书本,加上不正确的用眼习惯,使得视力下降成为普遍现象。在此背景下,一款优质的护眼台灯显得尤为…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
