2013-06-12 75 views
0

在引用的元素中查找逗號我試圖用CSV的雙引號元素中的佔位符文本替換逗號。正則表達式csv

例如,假設這條線在CSV:
1,2,"three,four,five",6,7,8,"nine,ten",11,12

使用這個表達式(報價逃脫的Java):

$1<COMMA>$2 

(?<=\")([^"]+?),([^"]+?)(?=\")

我更換第一場比賽

哪給了這個結果字符串:

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12 

我對resultString重複這些步驟,直到沒有更多匹配。下面是漸進的結果字符串:

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12 
1,2,"three<COMMA> four<COMMA> five",6,7,8,"nine,ten",11,12 
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7,8,"nine,ten",11,12 
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine,ten",11,12 
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12 
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12 

我如何調整我的正則表達式,因此只有「」列表項中,而不是分隔符本身代替?在第三次迭代中,我得到了一個匹配:「,6,7,8,」

我試圖通過讓我的lookbehind匹配僅針對一個dbl引用,並且周圍沒有dble引號或組三個DBL引號,但是碰上了「向後看組沒有明顯的最大長度」的錯誤,

+0

使用csv解析器解析,修改和重新創建csv會不會更容易? – assylias

回答

1

你可以改變它,這樣引號中的第一個匹配的字符不能是一個逗號:(?<=\")([^",][^"]*?),([^"]+?)(?=\")。說了這麼多,我不認爲迭代它,直到它停止迭代,因爲這是一個很好的方法。就我個人而言,我可能會使用非轉義列將行分割成一串字符串,然後遍歷數組,然後使用/ g修飾符對數組中的每個" -delimited字符串執行搜索並替換。但這是我個人的選擇。

+0

這樣做的訣竅,我同意你的觀點,現在我已經充分地將我的頭撞在牆上,這可能不是最好的方法,但它成了我需要從頭開始的一個癢。謝謝。 – jbd

0

快速谷歌後:

^(("(?:[^"]|"")*"|[^,]*)(,("(?:[^"]|"")*"|[^,]*))*)$ 

這在CSV文件的行單元素相匹配。

http://www.kimgentes.com/worshiptech-web-tools-page/2008/10/14/regex-pattern-for-parsing-csv-files-with-embedded-commas-dou.html

+0

這個正則表達式假定''''字符在CSV中被轉義爲'「」'但是CSV的標準化程度並不是很好,如果你要給出一個詳細的答案,那麼你應該先檢查字符是如何轉義的,但是運行一下就會發現,在jbd的情況下沒有引號需要被轉義。 –

+0

順便說一句,你用什麼語言? –

+0

我在regexr.com上試過這個,但是它匹配所有的線 – Andrew