java解析请求的字符串参数Content-Disposition: form-data;和拼接的键值对

news/2024/7/8 7:48:07 标签: java, form-data, 键值对, Content, 解析

项目场景:

获取到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: 19

2024-07-02 00:02:26
--38e67491-2794-4b83-a1d2-e2667bce6501
Content-Disposition: form-data; name="type"
Content-Length: 4

xqqk
--38e67491-2794-4b83-a1d2-e2667bce6501--

 示例:

java">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]+):匹配空行之后的非换行符字符序列,并将其捕获在一个组中。

请注意,这个解决方案假设“空行”是由两个连续的换行符定义的,并且在文本中不会有额外的空白行。如果文本中可能有多个空行,或者空行前后有额外的空白字符,您可能需要调整正则表达式以适应这些情况。

 

输出:

java">key:endDate,value:2024-07-02 00:02:26
key:type,value:xqqk

 


 二、解析&拼接的键值对

需要解析的字符串

java">key1=value1&key2=&key3=value3

 示例:

java">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)); // 输出: true
		System.out.println(isValidKeyValuePairs(input2)); // 输出: true
		System.out.println(isValidKeyValuePairs(input3)); // 输出: true
		System.out.println(isValidKeyValuePairs(input4)); // 输出: false
		System.out.println(isValidKeyValuePairs(input5)); // 输出: false
		
		boolean 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=value2
        String pattern = "([^&=&]+=[^&=&]*)(&([^&=&]+=[^&=&]*))*";
        return input.matches(pattern);
    }
	
}

 

这个正则表达式解释如下:

([^&=&]+) 匹配不包含'&', '=', 或者 '&' 的一个或多个字符,这代表键。

= 字面匹配。

[^&=&]* 匹配零个或多个不包含 '&', '=', 或者 '&' 的字符,这代表值。

(&([^&=&]+=[^&=&]*))* 匹配零个或多个以 '&' 开始,后面跟着键值对的子串。

输出:

java">true
true
true
false
false
key:key1,value:value1
key:key2,value:
key:key3,value:value3


http://www.niftyadmin.cn/n/5536852.html

相关文章

微信小程序留言板1

wxml&#xff1a; <view class"view2"> <text class"test1">留言&#xff1a;</text><input type"text" class"input1" bindinput"ipt"/><button class"btn" bindtap"btn"…

【云原生】服务网格(Istio)如何简化微服务通信

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、微服务架构的兴起 2、Istio&#xff1a;服务网格的佼…

上海-灵曼科技(面经)

上海-灵曼科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀&#xff08;写出来即可&#xff09; 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spri…

Oracle日志挖掘小结

一、安装logminer $ORACLE_HOME/rdbms/admin/dbmslm.sql $ORACLE_HOME/rdbms/admin/dbmslmd.sql 通常在安装数据库后就已经安装了Logminer&#xff0c;要查看数据库是否安装了LogMiner&#xff0c;只需查看数据库中是否已经有了dbms_logmnr和dbms_logmnr_d这2个package&…

Excel实现单元格内换行的几种方法

使用快捷键换行&#xff1a; 将光标定位在你希望换行的地方。按下 Alt Enter 组合键&#xff0c;这将在光标位置处插入一个新的行。 使用自动换行功能&#xff1a; 选中你希望自动换行的单元格。在“开始”标签页下的“对齐方式”组中&#xff0c;点击“自动换行”按钮。这会…

企业如何选择适合自己企业的MES系统?

MES系统能有效衔接上层ERP系统与底层自动化设备&#xff0c;实现生产过程的实时监控与优化。然而&#xff0c;MES系统的成功实施并非易事&#xff0c;不当的实施策略可能导致预期效益未能实现&#xff0c;甚至产生负面影响。本文将深入探讨MES系统功能以及企业如何才能成功落地…

Linux之文本三剑客

Linux之三剑客 Linux的三个命令,主要是用来处理文本,grep,sed,awk,处理日志的时候使用的非常多 1 grep 对文本的内容进行查找 1) 基础用法 语法 grep 选项 内容|正则表达式 文件选项: -i 不区分大小写 -v 排除,反选 -n 显示行号 -c 统计个数查看文件里包含有的内容 [roo…

Qt使用sqlite数据库及项目实战

一.sqlite使用介绍 在Qt中使用SQLite数据库非常简单&#xff0c;SQLite是一个轻量级的嵌入式数据库&#xff0c;不需要单独的数据库服务器&#xff0c;完全使用本地文件来存储数据。 当在Qt中使用SQLite数据库时&#xff0c;需要涉及到一些SQL语句以及Qt中的相关函数&#xf…