不同程序有不同的CSV格式,微软CSV格式文件中得到格式是用逗号将不同的字段进行分割,或者当字段包含逗号时候用双引号分割,举例如下:
一、微软CSV格式匹配
【文本】
your dollors,10000, 27 years old ,,”10,000”,”it is “10 Grand”,baby”,10k
这个例子中包含了七个字段,分别是
your dollors
10000
27 years old
空字段
10,000
it is “10 Grand”,baby
10k
【难点】在于“10,000”和“it is “10 Grand”,baby”,双引号中嵌套双引号和逗号
1、[^,"]+
可以获取之前用逗号和双引号分割的字段,但是这显然不足以将这七个字段完全正确的分割开;
2、双引号中包含逗号或双引号之间的文本,"(?:[^"]|"")*"
3、双引号嵌套:如果是双层嵌套,可以用表达式"[^,"]*"[^"]*"[^"]*"
因此,用以下表达式可以正确将文本分开
【表达式】
[^,"]+|,,|(?:"[^,"]*"[^"]*"[^"]*)"|"(?:[^"])*"
分解:
[^,"]+ #普通字段
|,, #空字段
|(?:"[^,"]*"[^"]*"[^"]*") #双层双引号嵌套
|"(?:[^"])*" #双引号嵌套逗号
这种双引号的嵌套解决办法有待进一步分析,如下
二、双引号中包含多个双引号
如果一个双引号中间有很多个双引号呢?,比如
“english: “a”, “b”, “c”, “d”, “e” and others”
【多个双引号的表达式】
(?:"[^,"]*(?:"[^"]*"[^"]*)*[^"]*)"
分解:
(
?:
" #最外侧起始双引号
[^,"]* #最外侧起始双引号与第二个双引号间的文本
(?:"[^"]*"[^"]*)+ #出现几对双引号,量词*
[^"]* #倒数第二个双引号与最外侧终止双引号之间文本
)
" #最外侧终止双引号
存在问题:当有多个这样的双引号时候,难以分辨