我的标题列表格式是字符串:
"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}