正则表达式—解析CSV文件

不同程序有不同的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”
【多个双引号的表达式】

(?:"[^,"]*(?:"[^"]*"[^"]*)*[^"]*)"
分解:
(
?:
    " #最外侧起始双引号 [^,"]*        #最外侧起始双引号与第二个双引号间的文本
        (?:"[^"]*"[^"]*)+      #出现几对双引号,量词*
                        [^"]* #倒数第二个双引号与最外侧终止双引号之间文本 ) "             #最外侧终止双引号

存在问题:当有多个这样的双引号时候,难以分辨

你可能感兴趣的:(正则表达式)