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

时间:2017-05-24 05:38:26

标签: java regex http http-headers

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

"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", ...} 问题是:&#34;来自:Donna Doe,首席洗瓶机,TO:John Doe,首席洗瓶机&#34; 这样的场景效果不好。

1 个答案:

答案 0 :(得分:0)

我相信你想在:之前提取任何1个字的字符作为,然后在字符串结尾之前提取任意数量的字符或1个字字符的第一个字符串然后是:

您可以考虑使用

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

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

<强>详情:

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

(.*?)(?=\s*\w+:|$)更具可读性,但效率较低。除了换行符(使用(.*?))之外,它会捕获到第2组中的任何0 +字符,但尽可能少(由于*?)直到第一次出现字符串结尾({{1 }}或0+空格+ 1个或多个单词字符+ $:正向前瞻)。

请参阅Java demo

(?=\s*\w+:|$)