当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python的`queue`模块
  • ARM/Linux嵌入式面经(十一):地平线嵌入式实习
  • CSS实现图片裁剪居中(只截取剪裁图片中间部分,图片不变形)
  • STL——map和set
  • 微软账户和本地账户有什么区别?如何切换登录账户?
  • Unity 使用AVProMovieCapture实现Game视图屏幕录制
  • 人脸检测(Python)
  • 程序使用openmp运行后出现错乱的问题
  • JVM专题之内存模型以及如何判定对象已死问题
  • 【论文阅读】-- Strscope:不规则测量的时间序列数据的多尺度可视化
  • 开源协作wiki和文档软件Docmost
  • 生物墨水:3D组织生物打印的基石
  • 操作系统笔记分享(第一章 操作系统引论)
  • 包装类的128陷阱
  • ES6 之 Set 与 Map 数据结构要点总结(一)
  • create-react-app做的留言板
  • echarts的各种常用效果展示
  • IDEA常用插件整理
  • js操作时间(持续更新)
  • React系列之 Redux 架构模式
  • yii2权限控制rbac之rule详细讲解
  • 创建一种深思熟虑的文化
  • 解析带emoji和链接的聊天系统消息
  • 前端学习笔记之观察者模式
  • 使用common-codec进行md5加密
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 优化 Vue 项目编译文件大小
  • 阿里云服务器购买完整流程
  • 选择阿里云数据库HBase版十大理由
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​学习一下,什么是预包装食品?​
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (1)Android开发优化---------UI优化
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一) storm的集群安装与配置
  • (一)Linux+Windows下安装ffmpeg
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)关于多人操作数据的处理策略
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .Family_物联网
  • .Net 8.0 新的变化
  • .NET Core 项目指定SDK版本
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net MVC + EF搭建学生管理系统
  • .Net MVC4 上传大文件,并保存表单
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET命令行(CLI)常用命令
  • .NET正则基础之——正则委托
  • .net中我喜欢的两种验证码
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——