1. 程式人生 > >正則表示式—解析CSV檔案

正則表示式—解析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”
【多個雙引號的表示式】

(?:"[^,"]*(?:"[^"]*"[^"]*)*[^"]*)"
分解:
(
?:
    "             #最外側起始雙引號
    [^,"]*        #最外側起始雙引號與第二個雙引號間的文字
        (?:"[^"]*"[^"]*)+      #出現幾對雙引號,量詞*
                        [^"]*  #倒數第二個雙引號與最外側終止雙引號之間文字
)
    "             #最外側終止雙引號

存在問題:當有多個這樣的雙引號時候,難以分辨