我的标题列表格式是字符串:
"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;
这样的场景效果不好。
答案 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+:|$)