2012-11-27 54 views
7

我有一個逗號分隔的數據源,並且引用限定。 CSV。但是,數據源提供者有時會做一些不起眼的事情。我已經補償了除了其中一個之外的所有人(我們逐行讀入文件,然後在清洗後將其寫回),並且當我的正則表達式相當弱時,我正在尋求解決最後剩下的問題。正則表達式匹配嵌入在另一個帶引號的字符串中的引用字符串

匹配另一個引號的字符串

所以這裏的內引用字符串是我們的榜樣串...

"foobar", 356, "Lieu-dit "chez Métral", Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

我期待匹配子「桑切斯梅特拉爾」,在爲了替換它的子串chezMétral。理想情況下,儘可能少的代碼行。最後的目標是將已經完成的替換寫回(或將其作爲方法返回值返回)。

所以我們的例子中字符串將最終成爲...

"foobar", 356, "Lieu-dit chez Métral, Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

我知道我可以定義圖案,如(?<quotedstring>\"\w+[^,]+\")匹配引用的字符串,但我的正則表達式福弱(數據庫開發人員,幾乎從來不使用C#),所以我不知道如何匹配指定組中的另一個引用字符串quotedstring


FYI:對於那些注意到,被格式化用逗號而不是引用合格的大整數,這已經處理。正如隨機使用行分隔符(有時是CR,有時是LF)。至於其他的問題...

+1

看起來您對CSV文件的嘗試非常糟糕(它不是有效的CSV)。正則表達式不太可能是一個很好的解決方案。 – Oded

+1

A - >「A」| a是CF語法,無法與正則表達式正確匹配。 – fardjad

+0

你是如何「處理」嵌入式逗號和「其他問題」的?同樣的方法可以用來處理額外的引號嗎? –

回答

4

與此regex

(?<!,\s*|^)"([^",]*)" 

替換現在$1

取代它嘗試here


逃逸"""它會成爲

(?<!,\s*|^)""([^"",]*)"" 
+0

看起來,除了「chezMétral」之外,使用上述模式「,356」和「,1,345,456,235,231」也是匹配。 –

+0

@TheLazyDBA它似乎沒有出現這種方式因爲我已經測試了它..它的作品 – Anirudha

+0

你是否可以進一步美化你的答案? –

相關問題