项目场景:
获取到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--
示例:
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;
}
}
输出:
key:endDate,value:2024-07-02 00:02:26
key:type,value:xqqk
二、解析&拼接的键值对
需要解析的字符串
key1=value1value3
示例:
public class TestService {
public static void main(String[] args) {
String input1 = "key1=value1value3";
String input2 = "key1=value1value2value3";
String input3 = "key1=";
String input4 = "key1=value1value2; // 不符合规则,因为键值对中缺少 '='
String input5 = "key1=value1value2; // 不符合规则,因为 '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=valuevalue2
String pattern = "([^=[^&]*)(=[^;
return input.matches(pattern);
}
}
输出:
true
true
true
false
false
key:key1,value:value1
key:key2,value:
key:key3,value:value3