可以拆分 http 标头列表的最佳正则表达式是什么?



我的标题列表格式是字符串:

"headerName1:value1,headerName2:value2,headerName3:value3,..."

因此,由于标题中可以存在逗号,因此使用它进行拆分可能是一个问题。

那么,我可以用于拆分的标题中可能不存在的字符是什么? 这是我的代码:

public List<Header> getHeaders(String headers) {
List<Header> headersList = new ArrayList<>();
if (!"".equals(headers)) {
String[] spam = headers.split(",");
for (String aSpam : spam) {
String[] header = aSpam.split(":",2);
if (header.length > 1) {
headersList.add(new Header(header[0], header[1]));
} else {
throw new HTTPSinkAdaptorRuntimeException("Invalid format");
}
}
return headersList;
}

我想要的输出是一个数组,{"headerName1:value1", "headerName2:value2", "headerName3:value3", ...}问题是:"来自:唐娜·多伊,首席洗瓶工,TO:约翰·多伊,首席洗瓶工" 像这样的场景它不能很好地工作。

我相信您想在:作为之前提取任何 1+ 单词字符,然后在字符串末尾或 1+ 单词字符的第一个序列之前提取任意数量的任何字符,后跟:.

您可以考虑使用

(w+):([^,]*(?:,(?!s*w+:)[^,]*)*)

这是(w+):(.*?)(?=s*w+:|$)正则表达式的展开变体。请参阅正则表达式演示。

详情

  • (w+)- 组 1(密钥)
  • :- 冒号
  • ([^,]*(?:,(?!s*w+:)[^,]*)*)- 第 2 组(值):
    • [^,]*- 除,以外的零个或多个字符
    • (?:,(?!s*w+:)[^,]*)*- 零个或多个序列:
      • ,(?!s*w+:)- 逗号后面没有 0+ 空格,然后是 1+ 单词字符 +:
      • [^,]*- 除,以外的零个或多个字符

(.*?)(?=s*w+:|$)更具可读性,但效率较低。它将除换行字符以外的任何 0+ 字符(带(.*?))捕获到第 2 组中,但尽可能少(由于*?),直到字符串末尾第一次出现 ($) 或 0+ 空格 + 1 个或多个单词字符 +:((?=s*w+:|$)正面展望)。

请参阅Java演示:

Map<String,String> hash = new HashMap<>();
String s = "headerName1:va,lu,e1, headerName2:v,a,lue2,headerName3:valu,,e3,hn:dddd, ddd:val";
Pattern pattern = Pattern.compile("(\w+):([^,]*(?:,(?!\s*\w+:)[^,]*)*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
hash.put(matcher.group(1), matcher.group(2)); 
} 
System.out.println(hash);
// => {headerName1=va,lu,e1, ddd=val, headerName2=v,a,lue2, hn=dddd, headerName3=valu,,e3}

最新更新