2008-10-08 55 views
0

讓我通過說我是一個完整的業餘愛好者來談RegEx,並且在幾天前纔開始。我試圖解決一個格式化文件的問題,並且遇到了特定類型的數據。輸入文件的結構是這樣的:正則表達式部分字符串CSV匹配

 
Two words,Word,Word,Word,"Number, number" 

我需要做的是格式,像這樣......

 
"Two words","Word",Word","Word","Number, number" 

我有過

s/,/","/g

工作正則表達式模式,但它也會替換已經引用的數字,數字部分中的逗號,這會導致字段分隔並中斷文件。實際上,我需要修改我的模式以用逗號「,」[逗號引用]替換逗號,但只有當該逗號後面沒有空格時。請注意,其他字段在逗號後面永遠不會有空格,只有分隔號碼列表。

我設法寫上去

s/,[A-Za-z0-9]/","/g

其中,同時匹配相應的字符串,將取代逗號和下面的字母。我聽說過反向引用,認爲這可能是我需要使用的?我的理解是,

s/(,)[A-Za-z0-9]\b

應該工作,但它沒有。

任何人有想法?

回答

1

s/,([^ ])/","$1/將匹配一個「,」後跟一個「非空格」,捕獲非空格,然後用捕獲的部分替換整個東西。

根據你正在使用哪個正則表達式引擎,你可能會寫\1或其他東西,而不是$1

如果您使用Perl或以其他方式訪問帶有負向視圖的正則表達式引擎,則可以使用s/,(?!)/","/(「,」後面沒有空格)。

但是,您的輸入看起來像CSV,如果實際上是,則最好使用真正的CSV解析器而不是使用正則表達式解析它。還有很多其他奇怪的角落案例需要擔心。

+0

我想通過CSV解析器來做到這一點,但我被賦予了這些文件,因爲它們沒有我在實際格式中的任何說法。所以我卡在RegEx上擺弄。 – 2008-10-08 03:23:14

+0

s /,(?!)/「,」/ 工作完美,謝謝。我使用Perl,因此我可以在發送文件時針對這些文件運行腳本。保存在解析器中並在那裏使用。此外,無論如何,我還是想學習Perl和RegEx,這樣一舉兩得。謝謝你的幫助 :)。 – 2008-10-08 04:28:39

2

我的經驗是,這不是一個很好的正則表達式的使用。如前所述,CSV文件最好由真正的CSV解析器處理。你沒有標記語言,所以很難說,但是在perl中,我使用Text :: CSV_XS或DBD :: CSV(允許我像訪問一個表一樣訪問一個CSV文件,當然,在封面下使用Text :: CSV_XS)。比滾動我自己的更簡單,並且比使用正則表達式更加強大。

0

看起來你正在使用桑達。

雖然您的模式似乎有點不一致,但我假設您希望每個用逗號分隔的項目都有引號。否則,你正在尋找計算複雜性正則表達式並不意味着處理的區域。

通過sed的,你的命令是:

sed 's/[ \"]*,[ \"]*/\", \"/g' 

注意,你仍然得把雙引號字符串的開頭和結尾。