正則表示式—解析CSV檔案
阿新 • • 發佈:2019-02-04
不同程式有不同的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”
【多個雙引號的表示式】
(?:"[^,"]*(?:"[^"]*"[^"]*)*[^"]*)"
分解:
(
?:
" #最外側起始雙引號
[^,"]* #最外側起始雙引號與第二個雙引號間的文字
(?:"[^"]*"[^"]*)+ #出現幾對雙引號,量詞*
[^"]* #倒數第二個雙引號與最外側終止雙引號之間文字
)
" #最外側終止雙引號
存在問題:當有多個這樣的雙引號時候,難以分辨