2010-12-08 49 views
1

我已下面的字符串不是由引號所包圍的標籤:甲正則表達式匹配

ID Table 1 Table 2 
1 "Column 1 Column 2 Column 3 
1 2 3 
4 5 6 
7 8 9" "Column A Column B Column C 
a b c 
d e f 
g h i" 

的第一行包含columnheaders(ID,表1,表2)。 Second行數據。

該字符串是通過從這個Excel張剪貼板複製: http://i.stack.imgur.com/5lwaT.png

列由\噸,一行\ r \ n分離。 B2和C2是表格。她的列和行也被\ t和\ r \ n分開。 每張表都被行情包圍。

現在我分裂行:

Dim rows() as String 
Regex = New Regex("\r\n") 
rows = Regex.Split(MyString) 

返回:

ID Table 1 Table 2 

1 "Column 1 Column 2 Column 3 
1 2 3 
4 5 6 
7 8 9" "Column A Column B Column C 
a b c 
d e f 
g h i" 

現在我需要分割線,但我需要一個返回模式每個不包含引號的選項卡。

任何人都可以幫助我的正則表達式嗎?

謝謝:)

+0

你應該真的檢查這篇文章http://secretgeek.net/csv_trouble.asp – Andrey 2010-12-08 20:00:23

回答

0

我用這對我的CSV文件,但應該有一些小的調整,讓它與製表符分隔以及工作:

Regex rExp = new Regex(@"(?:^|\x09)(\""(?:[^\""]+|\"\")*\""|[^\x09]*)"); 

以供參考,CSV正則表達式:

Regex rExp = new Regex(@"(?:^|,)(\""(?:[^\""]+|\""\"")*\""|[^,]*)"); 

請不這樣會捕捉周圍的報價爲好。

編輯

也許我假設太多,但好像你正在試圖獲得的數值,被逮住的分隔符。這將捕獲分隔符中的值。

EDITv2

使用逐字字符串

+0

使用逐字字符串呢?它會大大減少字符串中的字符數 – Andrey 2010-12-08 23:16:03

+0

這樣比較滿意嗎? ;-) – 2010-12-08 23:20:37

0

因爲我太累了,想一個好答案的,這裏是一個黑客,而不是一個。如果您可以確定引號是成對的,則可以通過三個步驟輕鬆破解:

  1. 找到引號中的選項卡並將它們交換出去。
  2. 在標籤上分割
  3. 將真正的標籤放回。

像這樣:

// JS psuedo-code 
str = str.replace(/("[^"]*)\t([^"]*")/g, '$1ëïÒ$2'); 
pieces = str.split(/\t/); 
for (var i=0,len=pieces.length;i<len;++i){ 
    pieces[i] = pieces[i].replace(/ëïÒ/g, "\t"); 
} 

這樣做的可怕黑客攻擊部分使用替換字符串,你可以希望永遠不會自然發生。

0

你要做的是創建你的CSV解析器(用你的案例中的標籤替換逗號)。有一篇關於爲什麼你不應該這樣做的偉大文章:http://secretgeek.net/csv_trouble.asp我曾經試圖編寫自己的解析器,但之後停下來,因爲它確實不那麼容易。 Check this free one。它爲我節省了幾個小時。