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

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

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

相关文章

代码随想录算法训练营第六十二天 | 108. 冗余连接、109. 冗余连接II、复习

108. 冗余连接 题目链接:https://kamacoder.com/problempage.php?pid1181 文档讲解:https://www.programmercarl.com/kamacoder/0108.%E5%86%97%E4%BD%99%E8%BF… 思路 从前向后遍历每一条边(因为优先让前面的边连上)&#xff0…

Simple_ReAct_Agent

参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph,以下为代码的实现。 Basic ReAct Agent(manual action) import openai import re import httpx import os from dotenv import load_dotenv, find_dotenvOPENAI_API_KEY os.getenv(OPEN…

java 实现人脸特征提取

1. 安装必要的库 确保你已经安装了JPEG库、BLAS和LAPACK库。在Ubuntu或Debian系统上,可以使用以下命令安装: sudo apt-get update sudo apt-get install libjpeg-dev libblas-dev liblapack-dev 在CentOS或Fedora系统上,可以使用以下命令安…

Numpy数组基础操作

1.创建数组 import numpy as np # ————创建数组———— np.array([1,2,3,4]) np.array(range(10))# 迭代对象 np.array([i for i in range(10) if i%20]) #列表,[]列表推导式返回列表 np.array([i for i in range(10) if i%20]) #()# 生成器,列表推…

Pytorch框架权重文件转onnx格式

Pytorch框架权重文件转onnx格式 代码案例 import torch import torchvision.models as modelsmodel models.resnet50() model.load_state_dict(torch.load("./model/pytorch-resnet50.pth"))model.eval() example_input torch.randn(32, 3, 224, 224) # 根据模型…

transformer网络学习

Transformer encoder-decoder模型之间共享的是Encoder最后一层输出的hidden-state。 GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. Bert2Bert中,Encoder的hidden-state同…

昇思25天学习打卡营第10天|ShuffleNet图像分类

ShuffleNet网络结构 ShuffleNet是一种专为移动设备设计的、计算效率极高的卷积神经网络(CNN)架构。其网络结构的设计主要围绕减少计算复杂度和提高模型效率展开,通过引入逐点分组卷积(Pointwise Group Convolution)和…

AutoX.js从某音分享链接解析出视频ID

背景 从某音分享的链接中解析出数字的videoID,用来做评论Intent跳转 思路 基本所有的短链接都是302跳转或者js跳转,熟悉http协议都知道,当状态码为302,从headers中提取Location即刻获得视频的原链接 链接中就带有videoId 要注意…

【大模型LLM面试合集】大语言模型基础_Word2Vec

Word2Vec 文章来源:Word2Vec详解 - 知乎 (zhihu.com) 1.Word2Vec概述 Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。 …

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人,被誉为“Java之父”的James Gosling,近日在社交媒体上宣布了自己正式退休的消息。Gosling表示:“我终于退休了。做了这么多年的软件工程师,现在是时候享受人生了。”他透露,在亚马逊的过去7年是非…

提高LabVIEW软件通用性的方法

提高LabVIEW软件通用性的方法 在使用LabVIEW开发软件时,提高软件的通用性非常重要。通用性意味着软件可以在不同的应用场景中使用,具备高度的适应性和灵活性,从而提高软件的价值和用户满意度。以下从多个角度详细探讨如何提高LabVIEW软件的通…

Java 反射相关的面试题

Java 创建对象有几种方式? new 创建新对象 通过反射创建对象 采用 clone 机制 通过序列化机制 使用 new 关键字 public class MyClass {public MyClass() {System.out.println("MyClass object created!");} }public class Main {public static voi…

太实用了吧?手把手教你华为eNSP模拟器桥接真实网络!

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 晚上好,我的网工朋友。 今天聊聊eNSP桥接正式网络,就是把eNSP桥接进真实的网络,利用我们的物理网卡通过实体路…

Unity Text Mesh Pro 中英文混编自动换行问题

问题描述 使用TextMeshPro 输入中英文时,在一行内 输入中英文,当英文部分超过第一行剩余位置时,整个英文部分都会自动换行 问题截图: 期待截图: 问题说明 因为 TextMeshPro识别中文后会带换行符。 解决方案 修改…

GEE代码实例教程详解:降水量异常分析

简介 在本篇博客中,我们将通过Google Earth Engine (GEE) 分析特定区域内的降水量异常。利用UCSB-CHG提供的CHIRPS(Climate Hazards Group InfraRed Precipitation with Station data)数据集,我们可以监测2000年至2020年期间的降…

人员定位系统的功能,你知道多少呢?

在此前的文章中,说到了人员定位系统用于化工厂定位这一用途来完善工厂管理,但同时,基于人员定位系统的强大功能,该系统的应用范围也要宽范的多,那么,本篇文章就来为大家介绍一下吧。 人员定位系统的功能简介…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端: 1、【产品中心】产品案列、新闻动态的发布; 2、【员工管理】新增、修改、删除、搜索功能;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

[每周一更]-(第104期):Go中使用Makefile的经验

文章目录 1. 项目结构2. Makefile的基础知识什么是 Makefile 3. Go项目的Makefile示例4. 详细解释每个Makefile目标5. 使用Makefile执行常见任务 在Go项目中,使用Makefile可以简化和自动化常见的开发和部署任务,如编译、测试、格式化和清理。深入认识及实…

javascript如何实现两个变量值互换

javascript如何实现两个变量值互换。 核心思路是在定义第三个变量 第一个变量值赋值给第三个变量 第二个变量赋值给第一个变量 第三个变量值赋值给第二个变量 代码如下 var a10 var b20 var c ca ab bc

SRS流媒体服务器概述

SRS/5.0(Bee) is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181. 翻译:SRS/5.0(Bee)是一款简洁、高效、实时的视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DAS…